hdu 2639 Bone Collector II

01背包统计第k优解,多开一维的数组,用来记录第几优解,然后每次更新的时候合并一下。。。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define N 1100
 5 #define K 100
 6 using namespace std;
 7 int dp[N][K],w[N],v[N],s[N];
 8 bool cmp(int a,int b){
 9     return a>b;
10 }
11 int main(){
12     int n,m,k,T;
13     cin>>T;
14     while(T--){
15         cin>>n>>m>>k;
16         for(int i=1;i<=n;i++)cin>>v[i];
17         for(int i=1;i<=n;i++)cin>>w[i];
18         memset(dp,0,sizeof(dp));
19         for(int i=1;i<=n;i++){
20             int cnt;
21             for(int j=m;j>=w[i];j--){
22                 cnt=0;
23                 for(int t=1;t<=k;t++){
24                     s[++cnt]=dp[j-w[i]][t]+v[i];
25                     s[++cnt]=dp[j][t];
26                 }
27                 sort(s+1,s+1+cnt,cmp);
28                 int x=1;
29                 dp[j][x++]=s[1];
30                 for(int t=2;t<=cnt;t++){
31                     if(s[t]!=s[t-1]){
32                         dp[j][x++]=s[t];
33                     }
34                     if(x>k)break;
35                 }
36             }
37         }
38         cout<<dp[m][k]<<endl;
39     }
40     return 0;
41 }
posted @ 2012-10-22 13:02  silver__bullet  阅读(166)  评论(0编辑  收藏  举报