您的位置:首页 > 其它

动态规划 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【】数组在变化中更新达到目的。

代码如下:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: