采药--动态规划

来源:互联网 发布:完整的hse培训矩阵 编辑:程序博客网 时间:2024/05/17 10:05
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;}


 

原创粉丝点击