您的位置:首页 > 其它

动态规划练习——采药

2017-04-20 21:19 155 查看
题目要求:

采每一株药都需要一些时间,每一株也有它自身的价值。一段时间内,可以采到一些草药。在规定时间内让采到的草药的总价值最大。

题目思路:

此题为01背包问题,令b[i][t]表示前i株药材恰在T时间内采完获得醉的价值,状态转移方程:b[i][t]=max{b[i-1][t],b[i-1][t-c[i]]+a[i]};

细节处理:

进行空间优化:b[t]=max{b[t],b[T-c[i]]+a[i]};初始化时除了b[0]至b[T]均设为0。

#include<bits/stdc++.h>
using  namespace std;
struct s{
int t;
int n;
}a[105];
int main()
{ int i,j,T,N;
int b[1005];
cin>>T>>N;
for(i=0;i<N;i++) cin>>a[i].t>>a[i].n;
for(i=0;i<=T;i++) b[i]=0;
for(i=0;i<N;i++)
{
for(j=T;j>=a[i].t;j--)
{if(b[j]<b[j-a[i].t]+a[i].n)
b[j]=b[j-a[i].t]+a[i].n;}
}
cout<<b[T]<<endl;
return 0;
}

感悟:根据01背包问题,只考虑第i件物品的策略,转化成一个只牵扯前i-1件物品的问题,寻找出题目的状态转移方程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: