采药--动态规划

http://www.rqnoj.cn/Problem_15.html
总结:
1、写的很顺利,很快就写好了,成功ac,尝试加些注释结果加的乱七八糟
2、调试问题1,提交的时候int max[101][1001]; 如果定义成全局变量就会报错,搞不懂
  调试问题2,if (j>=drug[i].time && ...) 写成 if (j>drug[i].time && ...) 运行结果有一定的测试点错误
 我前面两个动态规划的错误测试点,可能就是这里产生的,一会儿试试
  
  代表的意义不同,当有100s的采药时间的时候,就可以采需要100s时间的那个药,这个药的价值可能无穷大,就是题目的结果
而不用等到有101s的采药时间的时候才能采
  这是根本的区别,>= 和 > 有本质的区别 在代表的实际意义中,迥然不同  
 
#include <iostream>
using namespace std;

//物品数组,结构体,时间,价值
struct {
	int time;
	int value;
}drug[101];


int main()
{
	int totalTime, totalDrug;//总采药时间,总药品数
	int i,j;

	int max[101][1001]={0};//记录表格

	//读入数据
	cin>>totalTime>>totalDrug;
	for (i=1; i<=totalDrug; i++)
	{
		cin>>drug[i].time>>drug[i].value;
	}

	//m*n复杂度,记录结果
	//算法
	/* 1、思考过程,递归分治:将问题分解成若干子问题,让问题规模变小
	      对于最终最优结果,假如第N个药品没有采,那么最优结果就是 总时间为totalTime,采n-1个物品的最大价值
		对于n-1如果不是最大价值,有比它更大的那么与最优结果的假设矛盾,所以满足 最优子结构性质

          最终最大价值,就是两种情况,第n个物品采,要么没采的情况,max[n][m] = 较大值{max[n-1][m], max[n-1][m-time[n]]+value[n] }
		得出子问题重叠,和递推公式
		  用max[drug][time] 来建模描述,药品数drug,和当前采药时间time下的最大价值		
	*/
    for (i=1; i<=totalDrug; i++)
	{
		for (j=1; j<=totalTime; j++)
		{
			max[i][j] = max[i-1][j];
			if (j>=drug[i].time && max[i][j]<max[i-1][j-drug[i].time] + drug[i].value)
			{
				max[i][j] = max[i-1][j-drug[i].time] + drug[i].value;
			}
		}
	}

	cout<<max[totalDrug][totalTime];

	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值