问题描述
何老板要给大家买节日礼物,他有M元钱,学校小卖部有N种礼品,因为店长和何老板是熟人,所以若第i种礼品买x(x>0)件的话,店长会给何老板Ai*x+Bi颗糖果。
因为何老板非常喜欢吃糖,所以他希望获得的糖果越多越好。现给出每种礼品的单价Wi、Ai值与Bi值,问何老板最多能得到多少颗糖果?
输入格式
第一行,两个空格间隔的整数M和N
接下来N行,每行三个整数Wi, Ai 和 Bi,描述一种礼物的情况。
输出格式
一行,一个整数,表示何老板能得到的最大糖果数
样例输入
100 2
10 2 1
20 1 1
样例输出
21
提示
样例说明,何老板买了10个1号礼物,获得 2 × 10 + 1 = 21颗糖
1 ≤ M ≤ 2000
1 ≤ N ≤ 1000
0 ≤ Ai, Bi ≤ 2000
1 ≤ Wi ≤ 2000
/*
时间:2019.4.28
状态:f[j]表示当用了j钱时所得到的最大糖果数
方程:1.完全背包: f[j] = max(f[j], f[j - w[i]] + a[i]);
2.01背包: f[j] = max(f[j], f[j - w[i]] + a[i] + b[i]);
边界:
1 <= i <= n;
完全背包:w[i] <= j <= m;
01背包:m >= j >= w[i];
总结:
1.要善于把一般的背包问题转化成背包模型
*/
#include <bits/stdc++.h>
using namespace std;
int w[2000 + 5] = { };
int a[2000 + 5] = { };
int b[2000 + 5] = { };
int f[2000 + 5] = { };
int main()
{
int m, n;
scanf("%d %d", &m, &n);
for(int i = 1; i <= n; i++){
scanf("%d %d %d", &w[i], &a[i], &b[i]);
}
for(int i = 1; i <= n; i++){
for(int j = m; j >= w[i]; j--){
f[j] = max(f[j], f[j - w[i]] + a[i] + b[i]);
}
for(int j = w[i]; j <= m; j++){
f[j] = max(f[j], f[j - w[i]] + a[i]);
}
}
printf("%d", f[m]);
return 0;
}