您的位置:首页 > 其它

动态规划—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背包问题的时候就很好处理问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: