动态规划 03 (采药)

03 采药

t代表采药总时间,m代表药的数目,接下来m行,输入采每个药的时间和价值,求最大价值。

01背包问题,用一个结构体good,里面c代表时间,w代表价值。

用数组f【i】【v】表示前 i件药材花费时间 v,那么可得公式 f【i】【v】=max{f【i-1】【v】,f【i-1】【v-c【i】】},即第 i件药材放或者不放的问题。在实际代码中,二维数组可进行空间优化,用f【j】表示即可,f【】数组在变化中更新达到目的。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int MAX=101;
const int MAXX=1001;
struct good
{
	int c;
	int w;
}goods[MAX];
int main()
{
	int i,j,n,v;
	int f[MAXX];													 
	cin>>v>>n;
	for(i=0;i<=v;i++)											//f【v】代表  体积为 v   能装的最大价值 
		f[i]=0; 
	for(i=0;i<n;i++)
		cin>>goods[i].c>>goods[i].w;
	for(i=0;i<n;i++)											//前 i件 
	{
		for(j=v;j>=goods[i].c;j--)						//体积 j 
		{
			if(f[j]<f[j-goods[i].c]+goods[i].w)				//公式 
				f[j]=f[j-goods[i].c]+goods[i].w;
							 
		}
	}
	cout<<f[v]<<endl;
	
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值