动态规划—03采药
2017-04-18 22:27
127 查看
题目:第一行输入两个整数T,M,T代表可用的总时间,M代表共有几株草药,求在T时间内采到药的最高价值。
解题思路:每种草药都可以选择采或者不采,用f数组存采药的价值。所以通过循环(i从1—n)比较f[j-a[i]]+b[i]与f[j]的大小选最大的到最后得到的即是最大价值。
细节处理:此问题为0-1背包问题,通过空间优化将二维数组变成一维数组。
代码:#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,m,a[101],b[101],i,j,f[1002]={0};
cin>>t>>m;
for(i=1;i<=m;i++)
cin>>a[i]>>b[i];
for(i=1;i<=m;i++)
{
for(j=t;j>=a[i];j--)
if(f[j-a[i]]+b[i]>f[j])
f[j]=f[j-a[i]]+b[i];}
cout<<f[t]<<endl;
return 0;
}
感想:0-1背包问题方法很固定,所以判断出来是0-1背包问题的时候就很好处理问题了。
解题思路:每种草药都可以选择采或者不采,用f数组存采药的价值。所以通过循环(i从1—n)比较f[j-a[i]]+b[i]与f[j]的大小选最大的到最后得到的即是最大价值。
细节处理:此问题为0-1背包问题,通过空间优化将二维数组变成一维数组。
代码:#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,m,a[101],b[101],i,j,f[1002]={0};
cin>>t>>m;
for(i=1;i<=m;i++)
cin>>a[i]>>b[i];
for(i=1;i<=m;i++)
{
for(j=t;j>=a[i];j--)
if(f[j-a[i]]+b[i]>f[j])
f[j]=f[j-a[i]]+b[i];}
cout<<f[t]<<endl;
return 0;
}
感想:0-1背包问题方法很固定,所以判断出来是0-1背包问题的时候就很好处理问题了。
相关文章推荐
- 动态规划练习--03(采药)
- 动态规划经典问题03:数组中最大的数对差(或最小的数对差)
- 动态规划-问题示例与解题思路(采药问题 - nefu19)
- 动态规划 采药
- 动态规划-采药问题 [原题+题解]
- 算法复习之动态规划_03
- 03动态规划基础---机器人走方格问题
- C++动态规划之采药(openjudge)
- Sicily 1146 采药(DP动态规划——01背包问题)
- 动态规划--采药(01背包)
- C++动态规划之采药(openjudge)
- 2540. 【NOIP动态规划专题】采药2 (Standard IO)
- JZOJ8.11(C组)【NOIP动态规划专题】采药2 (Standard IO)
- 【NOIP动态规划专题】采药2
- 洛谷 1616——疯狂的采药(动态规划的背包问题)
- 【NOIP动态规划专题】采药2 (Standard IO)
- 03动态规划-01jump-game
- 动态规划 海军演习
- 动态规划——最长升序子序列
- 动态规划之01背包问题(Knapsacks Problem)