hdu 2639

来源:互联网 发布:淘宝新店一天自然流量 编辑:程序博客网 时间:2024/06/05 14:13

第K大背包问题

现在01的基础上多加一维,dp[v][k],表示在v下第k大的价值。。。

用A[ ],B[ ];分别记录加入第i件物品的前k个最大价值,不加入第i件物品的前k个最大价值

取两个数组的前k大值

也可以用一个数组存,再排序,找前k项

 

 

 

 

 

#include<stdio.h>#include<string.h>int dp[1010][40];int main(){int i,m,n,V[110],W[110],j,k,A[40],B[40],t,a,b,c,v;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&v,&k);for(i=0;i<n;i++)scanf("%d",&W[i]);for(i=0;i<n;i++)scanf("%d",&V[i]);memset(dp,0,sizeof(dp));for(i=0;i<n;i++)for(j=v;j>=V[i];j--){for(m=1;m<=k;m++){A[m]=dp[j-V[i]][m]+W[i];B[m]=dp[j][m];}A[m]=B[m]=-1;a=b=c=1;while(c<=k&&(a!=m||b!=m)){if(A[a]>B[b])dp[j][c]=A[a++];else dp[j][c]=B[b++];if(dp[j][c]!=dp[j][c-1])c++;}}printf("%d\n",dp[v][k]);}return 0;}


 

原创粉丝点击