动态规划练习——采药
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。
感悟:根据01背包问题,只考虑第i件物品的策略,转化成一个只牵扯前i-1件物品的问题,寻找出题目的状态转移方程。
采每一株药都需要一些时间,每一株也有它自身的价值。一段时间内,可以采到一些草药。在规定时间内让采到的草药的总价值最大。
题目思路:
此题为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件物品的问题,寻找出题目的状态转移方程。