#include using namespace std;

const int N = 1010;

int n, m; int v[N], w[N], s[N]; int f[N];

int main() { cin >> n >> m; for (int i = 1; i <= n; i ++ ) { cin >> v[i] >> w[i] >> s[i]; if (s[i] >= 0) //多重背包 { for (int j = m; j >= 0; j -- ) for (int k = 0; k <= s[i] && k * v[i] <= j; k ++ ) f[j] = max(f[j], f[j - k * v[i]] + k * w[i]); } else if (s[i] == -1) //01背包 { for (int j = m; j >= v[i]; j -- ) f[j] = max(f[j], f[j - v[i]] + w[i]); } else //完全背包 { for (int j = v[i]; j <= m; j ++ ) f[j] = max(f[j], f[j - v[i]] + w[i]); } } cout << f[m] << endl; return 0; }

用c++写一个程序满足以下要求:有 N 种物品和一个容量是 V 的背包。物品一共有三类:第一类物品只能用1次01背包;第二类物品可以用无限次完全背包;第三类物品最多只能用 si 次多重背包;每种体积是 vi价值是 wi。求解将哪些物品装入背包可使物品体积总和不超过背包容量且价值总和最大。输出最大价值。输入格式第一行两个整数NV用空格隔开分别表示物品种数和背包容积。接下来有 N 行每行三个整数 vi

原文地址: https://www.cveoy.top/t/topic/Mig 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录