hdu 2639 第k大01背包
2015-03-19 13:04
120 查看
求每个状态里的k优解,然后合并
/* HDU 2639 求01背包的第k大解。 合并两个有序序列 */ #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; const int MAXN=110; int dp[1010][50];//dp[i][j]表示容量为i,第j大的值 int value[MAXN]; int weight[MAXN]; int a[50]; int b[50]; int N,V,K; void DP() { memset(dp,0,sizeof(dp)); for(int i=0;i<N;i++) for(int j=V;j>=value[i];j--) { for(int k=1;k<=K;k++) { a[k]=dp[j][k]; b[k]=dp[j-value[i]][k]+weight[i]; } int x,y,z; x=y=z=1; a[K+1]=b[K+1]=-1;//这个一定要 while(z<=K&&(x<=K||y<=K))//合并两个已经排好序的序列 { if(a[x]>b[y])dp[j][z]=a[x++];//注意相同的只算一个 else dp[j][z]=b[y++]; if(dp[j][z]!=dp[j][z-1])z++; } } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&N,&V,&K); for(int i=0;i<N;i++)scanf("%d",&weight[i]); for(int i=0;i<N;i++)scanf("%d",&value[i]); DP(); printf("%d\n",dp[V][K]); } return 0; }
相关文章推荐
- HDU-2639 Bone Collector II (01背包 找第k优解 入门题)
- hdu 2639 Bone Collector II(01背包求第k优解)
- hdu2639 Bone Collector II 01背包边形,第k大价值
- hdu 2639 Bone Collector II (dp 01背包求第k优解)
- HDU 2639 Bone Collector II(01背包变型)
- HDU 2639 Bone Collector II [动态规划 第k大01背包]
- HDU 2639 Bone Collector II / 第K大的01背包
- HDU 2639 01背包求第k大
- hdu-2639-01背包变形之求第k优解-Bone Collector II
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
- HDU 2639 Bone Collector II(DP:01背包)
- HDU 2639 Bone Collector II(01背包变型)
- HDU--2639--Bone Collector II--01背包
- hdu 2639 01 背包 存在k 个多解问题
- hdu 2602 Bone Collector 01背包
- HDU 2602 捡骨头 【入门DP之01背包】
- hdu 2955 01 背包 Robberies
- HDU 2546--饭卡【01背包变形】
- HDU 2546 饭卡 基本的01背包
- HDU 2602 Bone Collector(赤裸裸01背包)