老规矩,按步来
step1:定义状态表示 f[i][j]表示从1到i个物品里选出价钱不超过j的最大乘积
step2:推导状态转移方程
step3:初始化 全部初始化为0就行
step4:填表顺序,从上到下
step5:结果,存储在f[n][m]里
优化成一维的话,要从右到左填表
代码实现
#include <iostream>
using namespace std;
const int N = 3e5;
typedef long long ll;
ll n,m;
ll w[N],v[N];
ll f[N];
int main()
{
cin >> m >> n;
for(int i = 1;i<=n;i++)
{
cin >> v[i] >> w[i];
}
for(int i = 1;i<=n;i++)
{
for(int j = m;j>=v[i];j--)
{
f[j] = max(f[j],f[j-v[i]]+v[i]*w[i]);
}
}
cout << f[m] << endl;
return 0;
}