rt,混合背包
问题 G: 混合背包
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
输入
第一行:二个整数,V(背包容量,V<=200),N(物品数量,N<=30);
第2..N+1行:每行三个整数Wi,Ci,Pi,前两个整数分别表示每个物品的重量,价值,第三个整数若为0,则说明此物品可以购买无数件,若为其他数字,则为此物品可购买的最多件数(Pi)。
输出
仅一行,一个数,表示最大总价值。
样例输入 Copy
10 3
2 1 0
3 3 1
4 5 4
样例输出 Copy
11
数据范围&样例说明
选第一件物品1件和第三件物品2件。
下面是我的代码,但是只能AC93%
#include "bits/stdc++.h"
using namespace std;
int v, n, cnt1 = 1, cnt2 = 1;
int v1[10000], w1[10000], v2[35], w2[35], dp[10000];
struct object{
int v, w, s;
} thing[35];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> v >> n;
for (int i = 1; i <= n; i++) cin >> thing[i].v >> thing[i].w >> thing[i].s;
for (int i = 1; i <= n; i++){
if(thing[i].s != 0)
for (int j = 1; j <= thing[i].s; j++){
v1[cnt1] = thing[i].v;
w1[cnt1] = thing[i].w;
cnt1++;
}
else{
v2[i] = thing[i].v;
w2[i] = thing[i].w;
cnt2++;
}
}
for (int i = 1; i <= cnt1; i++)
for (int j = v; j >= v1[i]; j--)
dp[j] = max(dp[j], dp[j - v1[i]] + w1[i]);
for (int i = 1; i <= cnt2; i++)
for (int j = v2[i]; j <= v; j++)
dp[j] = max(dp[j], dp[j - v2[i]] + w2[i]);
cout << dp[v];
return 0;
}
球挑QwQ