首页 > 代码库 > HDU 2639 Bone Collector II
HDU 2639 Bone Collector II
对每一个容量都存取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 else51 cout<<dp[v][kk]<<endl;52 }53 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。