十一届山东省赛补题_H(二维费用背包)

3 篇文章 0 订阅

newcode
三维:要从头跑到尾,才能把整个dp更新完整,不然dp更新不完整

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,H,S;
ll h[1010],s[1010],w[1010];
ll dp[1005][305][305];
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>H>>S;
    for(int i=1;i<=n;i++)
        cin>>h[i]>>s[i]>>w[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=H;j++)
        {
            for(int k=0;k<=S;k++)
            {
                dp[i][j][k]=dp[i-1][j][k];
                if(j>h[i]){
                    if(k>=s[i])
                        dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-h[i]][k-s[i]]+w[i]);
                    else if(j-h[i]-s[i]+k>0)
                        dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-h[i]-s[i]+k][0]+w[i]);
                }

            }
        }
    }
    cout<<dp[n][H][S]<<endl;
    return 0;
}

滚动数组优化
相当于01背包,拿和不拿,从高向底循环

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,H,S;
ll h,s,w;
ll dp[305][305];
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>H>>S;
    for(int i=1;i<=n;i++)
    {      
       cin>>h>>s>>w;
        for(int j=H;j>h;j--)
            for(int k=S;k>=0;k--)
                if(k>=s)
                    dp[j][k]=max(dp[j][k],dp[j-h][k-s]+w);
                else if(j-h-s+k>0)
                    dp[j][k]=max(dp[j][k],dp[j-h-s+k][0]+w);      
    }
    cout<<dp[H][S]<<endl;
    return 0;
}

1.不开ll 嗣
2.不滚动优化 嗣

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值