1. 程式人生 > >UVA 12563 DP

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;
}