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;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值