UVA 12563 DP
阿新 • • 發佈:2018-12-19
分析:
經典的揹包問題:
不過用兩個陣列,一個標記一共還能聽多少歌曲,一個標記聽歌的總時間。
不過如果採用滾動陣列的話一個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; }