UVA 12563 DP

分析:

经典的背包问题:

不过用两个数组,一个标记一共还能听多少歌曲,一个标记听歌的总时间。

不过如果采用滚动数组的话一个dp数组就足够用了。

#include<bits/stdc++.h>

using namespace std;

const int maxn=1e4;

int dp[55][maxn];
int ans[55][maxn];

int main(){
    int n,t;
    int T;
    scanf("%d",&T);
    for(int cs=1;cs<=T;cs++){
        scanf("%d%d",&n,&t);
        memset(dp,0,sizeof dp);
        memset(ans,0,sizeof ans);
        for(int i=1;i<=n;i++){
            int a;scanf("%d",&a);
            for(int j=0;j<t;j++){
                dp[i][j]=(i==1?0:dp[i-1][j]);
                ans[i][j]=(i==1?0:ans[i-1][j]);
                if(j>=a){
                    if(dp[i][j]<=dp[i-1][j-a]+1){
                        if(dp[i][j]==dp[i-1][j-a]+1)
                            ans[i][j]=max(ans[i][j],ans[i-1][j-a]+a);
                        else ans[i][j]=ans[i-1][j-a]+a;
                        dp[i][j]=dp[i-1][j-a]+1;
                    }
                }
            }
        }
        printf("Case %d: %d %d\n",cs,dp[n][t-1]+1,ans[n][t-1]+678);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/83685405