P1616 疯狂的采药(完全背包)

文章讲述了在计算机科学中,如何解决完全背包问题,即有多种物品和固定容量的背包,每种物品无限,目标是最大化价值而不超过背包容量。与01背包的区别在于物品数量不限。提供了一个使用动态规划的C++代码示例来求解此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完全背包

定义:有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是v[i],价值是val[i]。将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

完全背包与01背包的区别就是每件物品有无限件。

 例题 

P1616 疯狂的采药

解题思路:

这道题和采药的不同在于可以无限采取草药,也还需注意数据范围。

与 01 背包问题的代码只有v的循环次序不同,需要一个已选入第i种物品的结果 f[i][v-w[i]]。

#include<iostream>
#include<cmath>
using namespace std;
const int N=1e4+10,M=1e7+10;
int n,m;
long long q[M];
int v[N],w[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=v[i];j<=m;j++)
		{
			q[j]=max(q[j],q[j-v[i]]+w[i]);	
		}
	cout<<q[m]<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值