zoukankan      html  css  js  c++  java
  • [swustoj 594] Maximum Tape Utilization Ratio

    Maximum Tape Utilization Ratio(0594)

    Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 467 Accepted: 67
    Description

    设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是li ,1 < = i < = n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。在保证存储最多程序的前提下还要求磁带的利用率达到最大。 对于给定的n个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数和占用磁带的长度。

    Input

    第一行是2 个正整数,分别表示文件个数n <=600和磁带的长度L<=6000。接下来的1 行中,有n个正整数,表示程序存放在磁带上的长度。

    Output

    第1 行输出最多可以存储的程序数和占用磁带的长度;第2行输出存放在磁带上的每个程序的长度。

    Sample Input

    9 50
    2 3 13 8 80 20 21 22 23

    Sample Output
    5 49
    2 3 13 8 23

    简单背包+路径输出

    就是有点坑、题目描述不清楚、如果有多个解、输出第一次出现的那个序列

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    int n,s;
    int w[605];
    int path[605];
    int dp[605][6005][2];
    
    int main()
    {
        int i,j,k;
        while(scanf("%d%d",&n,&s)!=EOF)
        {
            for(i=1;i<=n;i++)
            {
                scanf("%d",&w[n+1-i]);
            }
            memset(dp,0,sizeof(dp));
            for(i=1;i<=n;i++)
            {
                for(j=0;j<=s;j++)
                {
                    if(w[i]<=j && dp[i-1][j][0]<dp[i-1][j-w[i]][0]+1)
                    {
                        dp[i][j][0]=dp[i-1][j-w[i]][0]+1;
                        dp[i][j][1]=dp[i-1][j-w[i]][1]+w[i];
                    }
                    else if(w[i]<=j && dp[i-1][j][0]==dp[i-1][j-w[i]][0]+1)
                    {
                        dp[i][j][0]=dp[i-1][j][0];
                        dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-w[i]][1]+w[i]);
                    }
                    else
                    {
                        dp[i][j][0]=dp[i-1][j][0];
                        dp[i][j][1]=dp[i-1][j][1];
                    }
                }
            }
            printf("%d %d
    ",dp[n][s][0],dp[n][s][1]);
            i=n,j=dp[n][s][1],k=1;
            while(i)
            {
                if(dp[i][j][0]==dp[i-1][j-w[i]][0]+1 && dp[i][j][1]==dp[i-1][j-w[i]][1]+w[i])
                {
                    j-=w[i];
                    path[k++]=w[i];
                }
                i--;
            }
            for(k=1;k<=dp[n][s][0];k++)
            {
                if(k!=1) cout<<' ';
                cout<<path[k];
            }
            cout<<endl;
        }
        return 0;
    }
    趁着还有梦想、将AC进行到底~~~by 452181625
  • 相关阅读:
    最大比例(压轴题 )
    HDU-1016-素数环
    HDU-1241-油藏
    POJ-2251-地下城
    UVa-12096-集合栈计算机
    UVa-156-反片语
    UVa-10815-安迪的第一个字典
    UVa-101-木块问题
    UVa-10474-大理石在哪
    HDU-2955-Robberies
  • 原文地址:https://www.cnblogs.com/hate13/p/4109281.html
Copyright © 2011-2022 走看看