解题思路:
本题属于0/1背包问题,具体思路说不上,只需要记住两个公式即可
背包问题只考虑两种情况:采药/不采
dp[i][j],其中i代表第i个物品,j代表剩余时间;(用于统计最后的数据)
cost[],采所花费的时间
value[],采所得到的价值
若采:dp[i][j]=dp[i-1][j-cost[i]]+value[i] 需要剩余时间>=所花费的时间
不采:dp[i][j]=dp[i-1][j]
最后通过公式代入for循环即可
注意事项:
参考代码:
#include<iostream>
using namespace std;
#include<cstring>//数组归零头文件
//#include<algorithm>//排序头文件
int main()
{
int T, M;//总时间/山洞草药数木
cin >> T >> M;
int cost[110] = {0};//采药花费的时间
int value[110] = {0};//所采药材的价值
int dp[110][1010];//统计结果(药材总数目,药材总时间)
memset(dp, 0, sizeof(dp));//数组归零
for (int i = 1; i < M + 1; i++)
cin >> cost[i] >> value[i];
for(int i=1;i<M+1;i++)
for (int j = 1; j < T + 1; j++)
{
if (j >= cost[i])//剩余时间>所需时间
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cost[i]] + value[i]);//比较采/不采
else//剩余时间不够
dp[i][j] = dp[i - 1][j];//不采
}
cout << dp[M][T];//输出
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复