洛谷 P1616 疯狂的采药(动态规划)

https://www.luogu.com.cn/problem/P1616

题意:

有t元m件物品,每件物品价钱v、价值w,可以无限拿,求可以拿的最大价值

思路:

和01背包不同的是这里物品是无限拿的,在之前讲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;
}

猜你喜欢

转载自blog.csdn.net/xiaolan7777777/article/details/105668883