首页 > 其他 > 详细

HDU 2639 Bone Collector II

时间:2014-07-16 19:23:24      阅读:314      评论:0      收藏:0      [点我收藏+]

对每一个容量都存取kk个价值,加入新的价值之后,进行排序,取前kk个价值(从大到小)。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<set>
 6 #include<vector>
 7 #include<map>
 8 #include<algorithm>
 9 #include<cmath>
10 #include<stdlib.h>
11 using namespace std;
12 int main()
13 {
14     int t,n,v,kk,i,j;
15     int dp[1010][75];
16     int va[1010],vo[1010];
17     cin>>t;
18     while(t--)
19     {
20         cin>>n>>v>>kk;
21         memset(dp,0,sizeof(dp));
22         for(i=0;i<=v;i++)    //dp[i][0] 表示容量为 i 的价值种类数
23         dp[i][0]=1;
24         for(i=1; i<=n; i++)
25             cin>>va[i];
26         for(i=1; i<=n; i++)
27             cin>>vo[i];
28 
29         for(i=1;i<=n;i++)
30         for(j=v;j>=vo[i];j--){
31             int cnt=dp[j][0];
32             for(int k=1;k<=dp[j-vo[i]][0];k++)
33                 dp[j][++cnt]=dp[j-vo[i]][k]+va[i];
34             int tmp[70],num=1;
35             for(int k=1;k<=cnt;k++)
36             tmp[k]=dp[j][k];
37             sort(tmp+1,tmp+1+cnt);      //对价值进行排序,之后取前kk个价值,如果不足则全取
38             dp[j][1]=tmp[cnt];
39             for(int k=cnt-1;k>=1;k--)   //取前kk个价值,如果不足则全取
40             if(tmp[k]!=tmp[k+1])
41             {
42                 if(num+1>kk)
43                 break;
44                 dp[j][++num]=tmp[k];
45             }
46             dp[j][0]=num;
47         }
48         if(dp[v][0]<kk)
49         cout<<0<<endl;
50         else
51         cout<<dp[v][kk]<<endl;
52     }
53 }

 

HDU 2639 Bone Collector II,布布扣,bubuko.com

HDU 2639 Bone Collector II

原文:http://www.cnblogs.com/ainixu1314/p/3844532.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!