码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2639 Bone Collector II

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

标签:style   blog   color   os   for   io   

对每一个容量都存取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

标签:style   blog   color   os   for   io   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!