https://www.luogu.com.cn/problem/P1616
题意:
有t元m件物品,每件物品价钱v、价值w,可以无限拿,求可以拿的最大价值
思路:
和01背包不同的是这里物品是无限拿的,在之前讲01背包的时候,我们为了使每件物品只能拿一次,选择了逆序枚举钱数,这里因为无限拿,把正序改为逆序就可以了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e7+7;
int f[maxn];
int w[10004],v[10004];
int main()
{
int t,m;
cin>>t>>m;
for(int i=1;i<=m;i++)
cin>>v[i]>>w[i];
for(int i=1;i<=m;i++)
{
for(int j=0;j<=t;j++)//若是01背包 for(int j=t;j>=0;j--)
{
if(j>=v[i])
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[t];
return 0;
}