题目大意:给定背包容量m,物品种类n,每种物品的重量w[i],还有卖的数量x对应的价值a[i]*x+b[i],求最大的价值。
思路:01背包选好第一个物品,即确定价值量a[i]+b[i],然后完全背包走一遍,每次价值加a[i].
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define maxn 2024
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
int dp[maxn];
int w[maxn], a[maxn], b[maxn];
int n, m;
int main()
{
int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &m, &n);
for (int i = 1; i <= n; ++i) {
scanf("%d%d%d", &w[i], &a[i], &b[i]);
}
mem(dp, 0);
for (int i = 1; i <= n; ++i) {
for (int j = m; j >= w[i]; --j) {
dp[j] = max(dp[j - w[i]] + a[i] + b[i], dp[j]);
}
for (int j = w[i]; j <= m; ++j) {
dp[j] = max(dp[j], dp[j - w[i]] + a[i]);
}
}
printf("%d\n", dp[m]);
}
return 0;
}