设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为m,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于m,而价值的和为最大。
输入 第1行:两个整数,m(背包容量,m<=200)和n(物品数量,n<=30);
第2至n+1行:每行两个整数Wi,Ci,表示每个物品的重量和价值。
输出 仅一行,一个数,表示最大总价值。
样例 样例输入1 10 4 2 1 3 3 4 5 7 9 样例输出1 max=12
#include<bits/stdc++.h>
using namespace std;
int weight[50 + 1];
int value[50 + 1];
int num[20 + 1];
int f[1000 + 1];
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n, m;
cin >> n;cin >> m;
for (int i = 1; i <= n; i++) {
cin >> weight[i] >> value[i] >> num[i];
}
int k = n + 1;
for (int i = 1; i <= n; i++) {
while (num[i] != 1) {
weight[k] = weight[i];
value[k] = value[i];
k++;
num[i]--;
}
}
for (int i = 1; i <= k; i++) {
for (int j = m; j >= 1; j--) {
if (weight[i] <= j) f[j] = max(f[j], f[j - weight[i]] + value[i]);
}
}
cout <<"max="<< f[m] << endl;
}
为什么不对