简单的背包——01背包(4)
题目来源:洛谷 P1060 [NOIP2006 普及组] 开心的金明
共十个测试点
题解
AC代码
#include <bits/stdc++.h>
using namespace std;
// 结果较大
typedef long long ll;
const int maxn = 3e4 + 5;
// f[x] 表示金额 x 时可以选择的最大的价值 (价值 = 金额 × 重要性)
ll f[maxn];
int n, m;
int v, p, val;
int main()
{
// 初始化
memset(f, 0, sizeof(f));
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i)
{
scanf("%d%d", &v, &p);
val = v * p;
// n ~ v 消除后效性
for (int j = n; j >= v; --j)
{
f[j] = max(f[j], f[j - v] + val);
}
}
printf("%lld", f[n]);
return 0;
}