标签:des style blog class code c
这是一个典型的求第k优解的问题。。背包九讲上面都有。。。所有我只讲一下我的思路。。求第k优解就是在最优解的复杂度上增加了一个k,每次用一个物品去更新dp[v]的时候用一个数组保存才来。。然后排序,题目说要去重,那就很好办了。。然后经过N个物品的更新,那么最后的答案就是打dp[V][K]..
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639
题目为:
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2037 Accepted Submission(s): 1058
3 5 10 2 1 2 3 4 5 5 4 3 2 1 5 10 12 1 2 3 4 5 5 4 3 2 1 5 10 16 1 2 3 4 5 5 4 3 2 1
12 2 0
代码为:
#include<cstring> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int dp[1005][40],cost[105],value[105],ans[10000]; int N,V,K; bool cmp(int a,int b) { return a>b; } int main() { int t,i,j,cnt,pos,k; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); scanf("%d%d%d",&N,&V,&K); for(i=1;i<=N;i++) scanf("%d",&value[i]); for(i=1;i<=N;i++) scanf("%d",&cost[i]); for(i=1;i<=N;i++) for(j=V;j>=cost[i];j--) { cnt=1; for(k=1;k<=K;k++) { ans[cnt++]=dp[j][k]; ans[cnt++]=dp[j-cost[i]][k]+value[i]; } sort(ans+1,ans+cnt,cmp); int x=1; for(k=1;k<cnt-1;k++) { if(x>K) break; if(ans[k]!=ans[k+1]) dp[j][x++]=ans[k]; } } printf("%d\n",dp[V][K]); } return 0; }
标签:des style blog class code c
原文地址:http://blog.csdn.net/u014303647/article/details/25960325