站外题求助
  • 板块灌水区
  • 楼主Xianzi_
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/5 11:41
  • 上次更新2024/10/5 14:36:45
查看原帖
站外题求助
591561
Xianzi_楼主2024/10/5 11:41

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

2024/10/5 11:41
加载中...