该题是一个完全背包问题,不难得出状态转移方程
dp_i = max(dp_i,dp_{i-v} + w);
用记忆化搜索的话内存会爆,因此我们用滚动数组来解决。
下面附上代码
#include <iostream>
using namespace std;
int t, m;
long long a[10005], b[10005], f[10000005];
int main()
{
cin >> t >> m;
for (int i = 1; i <= m; i++)
cin >> a[i] >> b[i];
for(int i=1;i<=m;i++)
for (int j = a[i]; j<=t; j++)
{
f[j] = max(f[j], f[j - a[i]] + b[i]);
}
cout << f[t];
return 0;
}