强壮的ZZW (一维dp 01背包)

题目描述

ZZW神牛想要通过吃东西变得强壮!于是他买了N(1<=N<=4000)件食物,每件食物有自己的体积V(1<=V<=400),以及可以为ZZW增加的强壮度D(1<=D<=100),ZZW的胃只有S(1<=S<=15000)那么大,他要怎么吃才能得到最多的强壮度呢?求可以获得的最大强壮度。

输入

第一行为N和S
后面N行每行有两个数Vi和Di,表示每件食物的体积和可增加的强壮度

输出

输出一个数,可获得的最大强壮度

样例输入 Copy

4 6
1 4
2 6
3 12
2 7

样例输出 Copy

23

分析:二维会爆空间,一维优化。

 一维是在二维的原理基础上对空间的优化

#include <iostream>
#include <cstring>
using namespace std;
int main ()
{
    int n,s;
    cin>>n>>s;
    int dp[s+1];               //dp[q]表示 在背包空间为q(q<=s)时前p(p<=n)件商品的最优解
    memset(dp,0,sizeof(dp));
    int v[n+1];
    int d[n+1];
    int i,j; 
    for(i=1;i<=n;i++)           
    {
        cin>>v[i]>>d[i];
    }
    for(i=1;i<=n;i++)           //前i件物品的选取
    {
        for(j=s;j>=v[i];j--)    //背包空间为j时前i件物品的选取
        {
            dp[j]=max(dp[j],dp[j-v[i]]+d[i]);  // 前一个的dp[j]是当前i, 后两个dp[] dp[]
        }             //不装  //装            //是i-1循环得出的
    }                                
    cout<<dp[s];
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值