【动态规划】洛谷P1802 5 倍经验日(01背包问题)

一个洛谷普及-的题目,也是我刚刚入门学习动态规划的练习题。

下面发一下我的思路和代码题解:

 

我的思路及伪代码:

 

 

 

我的AC图:

 

 

 

接下来上代码:

 1 //动态规划 洛谷P1802 五倍经验日
 2 #include<iostream>
 3 #include<cmath>
 4 using namespace std;
 5 struct human
 6 {
 7     int l;//失败
 8     int w;//胜利
 9     int u;//use
10 }hu[1005];
11 long long ans[1005];//在主函数外 直接初始化为0
12 int main()
13 {
14     int n,x;
15     cin>>n>>x;
16     for(int i=1;i<=n;++i)
17     {
18         cin>>hu[i].l>>hu[i].w>>hu[i].u;
19         hu[i].w*=5;//注意题干!五倍经验
20         hu[i].l*=5;
21     }
22     for(int i=1;i<=n;++i)//外层循环 循环每一个use的值
23     {
24         for(int j=x;j>=hu[i].u;--j)//要从大遍历到小 注意!
25         {
26             ans[j]=max(ans[j]+hu[i].l,ans[j-hu[i].u]+hu[i].w);//状态转移方程
27         }
28         //本题特殊点 输了也有经验 所以有状态转移方程②
29         for(int j=hu[i].u-1;j>=0;j--)//注意是use[i]-1开始遍历 因为少的肯定输
30         {
31             ans[j]+=hu[i].l;//其实也用了贪心 少的直接一瓶药都不出
32         }
33         cout<<ans[x];
34     }
35     return 0;
36 }

 

结束啦。

posted @ 2022-03-31 00:27  朱朱成  阅读(68)  评论(0编辑  收藏  举报