标签:
3 5 10 2 1 2 3 4 5 5 4 3 2 1 5 10 12 1 2 3 4 5 5 4 3 2 1 5 10 16 1 2 3 4 5 5 4 3 2 1
12 2 0
大概就是求能装下的第k多的价值
dp数组增加一维 作为第l多的价值
dp[j][l] dp[j-vo[i]][l] + va[i] 用数组a和b分别存下 之后放在一起判断大小排序 其他同01背包
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1011;
int va[maxn], vo[maxn];
int n, v, k;
int dp[maxn][55];
int a[55], b[55];
int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d%d%d", &n, &v, &k);
for(int i = 1; i <= n; ++i){
scanf("%d", &va[i]);
}
for(int i = 1; i <= n; ++i){
scanf("%d", &vo[i]);
}
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; ++i){
for(int j = v; j >= vo[i]; --j){
for(int l = 1; l <= k; ++l){
a[l] = dp[j][l];
b[l] = dp[j-vo[i]][l] + va[i];
}
a[k+1] = b[k+1] = -1;
int x = 1, y = 1, w = 1;
while(w <= k && (x <= k || y <= k)){
if(a[x] > b[y]){
dp[j][w] = a[x++];
}
else{
dp[j][w] = b[y++];
}
if(w == 1 || dp[j][w] != dp[j][w-1]){
++w;
}
}
}
}
printf("%d\n", dp[v][k]);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
【HDU2639】Bone Collector II(01背包第k优解)
标签:
原文地址:http://blog.csdn.net/u012431590/article/details/47059481