动态规划 03 (采药)
2017-04-17 20:20
162 查看
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【】数组在变化中更新达到目的。
代码如下:
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; }
相关文章推荐
- 动态规划练习一 03:采药
- 动态规划练习03:采药
- SDNU——1043.采药2(动态规划——完全背包)
- 夕拾算法进阶篇:19)采药 (01背包_动态规划DP)
- 动态规划练习--03(采药)
- 动态规划—03采药
- 【动态规划】采药
- 【动态规划】Vijos P1104 采药(NOIP2005普及组第三题)
- 【动态规划】poj2773采药问题
- |Tyvj|NOIP2005|动态规划|P1005 采药
- 动态规划--九度1123.[采药]
- 动态规划练习——采药
- 采药 动态规划
- 动态规划 03题
- 找啊找啊找GF --动态规划--类似采药
- 动态规划03—最长非降子序列的长度(LIS)
- 动态规划-采药
- 洛谷P1832 A+B Problem(再升级) [2017年4月计划 动态规划03]
- 采药(动态规划)(01背包)
- 03-算法的乐趣-动态规划