标签:sea 状态 seq first stream art name ber esc
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4824 Accepted Submission(s): 2514
//以前的dp[V]数组再加一维dp[V]K]表示V状态时第k大的值,当枚举到第i个物品时 //dp[i][V]=max(dp[i-1][V],dp[i-1][V-v]),当前状态由两个状态转移来的所以前k大的值 //也是由两个状态的前k大的值转移来的。注意本体价值重复的算一个。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN=109; const int MAXV=1009; const int MAXK=39; int dp[MAXV][MAXK]; int val[MAXN],vol[MAXN]; int N,V,K; int main() { int t; scanf("%d",&t); while(t--){ scanf("%d%d%d",&N,&V,&K); for(int i=1;i<=N;i++) scanf("%d",&val[i]); for(int i=1;i<=N;i++) scanf("%d",&vol[i]); memset(dp,0,sizeof(dp)); for(int i=1;i<=N;i++){ for(int j=V;j>=vol[i];j--){ int a1=1,a2=1,p1[39],p2[39]; for(int c=1;c<=K;c++){ p1[c]=dp[j][c]; p2[c]=dp[j-vol[i]][c]+val[i]; } p1[K+1]=p2[K+1]=-1; int c=0; while(c!=K){ int tmp=max(p1[a1],p2[a2]); if(tmp==p1[a1]){ a1++; if(tmp!=dp[j][c]) dp[j][++c]=tmp; else if(tmp==0) dp[j][++c]=0; } else if(tmp==p2[a2]){ a2++; if(tmp!=dp[j][c]) dp[j][++c]=tmp; else if(tmp==0) dp[j][++c]=0; } } //cout<<i<<" "<<j<<endl; //for(int k=1;k<=K;k++) cout<<dp[j][k]<<" "; //cout<<endl; } } printf("%d\n",dp[V][K]); } return 0; }
标签:sea 状态 seq first stream art name ber esc
原文地址:http://www.cnblogs.com/--ZHIYUAN/p/6958678.html