NOI 1775:采药(C++) 动态规划

典型的01背包,动态规划问题

虽然AC了,但是还有有点不明白,为什么要加不选择物体的for循环(初步的想法是,有可能条件不满足调价物体,但是不应该是0,最少应该是【i-1】【j】的值)

参考:

 http://qkxue.net/info/130583/OpenJudge-2-6-1775

http://www.hawstein.com/posts/dp-knapsack.html

#include "iostream"
using namespace std;
int result[101][1001];//maxP[i][j]表示前i个物体装到剩余体积为j的背包里能达到的最大价值
int main()
{
    int T,M;//总时间上限,草药个数
    cin>>T>>M;
    for(int i=1;i<=M;i++)
    {
        int perT,perP;//某种草药采摘岁需要的时间和价值
        cin>>perT>>perP;
        for(int j=0;j<=T;j++)//不选择物体
        {
            result[i][j] = result[i-1][j];
        }
        for(int j=0;j<=T;j++)//选择物体
        {
            if(j+perT<=T)
                result[i][j+perT] = max(result[i-1][j+perT],result[i-1][j]+perP);
            //举例子:宝石
            //从d(2, 7)到d(3, 10)就隔了1个宝石。 它有两种情况,装或者不装入背包。
            // 如果装入,在面对前2个宝石时, 背包就只剩下体积7来装它们,而相应的要加上2号宝石的价值12, d(3, 10)=d(2, 10-3)+12=d(2, 7)+12;
            // 如果不装入,体积仍为10,价值自然不变了, d(3, 10)=d(2, 10)。记住,d(3, 10)表示的是前3个宝石装入到剩余体积为10 的背包里能达到的最大价值,
            // 既然是最大价值,就有d(3, 10)=max{ d(2, 10), d(2, 7)+12 }。
        }
    }
    cout<<result[M][T]<<endl;
    return 0;
}

    原文作者:动态规划
    原文地址: https://blog.csdn.net/v_xchen_v/article/details/66970217
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞