Codeforce294 B. Shaass and Bookshelf(01背包)

题意:

在这里插入图片描述

在这里插入图片描述

数据范围:n<=100,1<=t[i]<=2,1<=w[i]<=100

解法:
01背包变形.
v[i]表示书的厚度,w[i]表示书的宽度.
d[i]表示将厚度为i的书放在上面(代价是宽度的和),需要的最小书架长度.
每种书对应放上面和不放上面,对应01背包的两种决策.

设厚度总和为c,当厚度i放在上面时,显然c-i厚度在下面.
此时上面的宽度为d[i],那么当c-i>=d[i]时符合条件,可以用c-i更新答案.
找到合法的最小答案即可.
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e6;
int d[maxm];
int v[maxm];
int w[maxm];
int n;
signed main(){
    cin>>n;
    int c=0;
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];//v[i]是厚度,w[i]是宽度
        c+=v[i];
    }
    for(int i=0;i<=c;i++)d[i]=1e9;
    d[0]=0;
    for(int i=1;i<=n;i++){
        for(int j=c;j>=v[i];j--){
            d[j]=min(d[j],d[j-v[i]]+w[i]);
        }
    }
    int ans=1e9;
    for(int i=0;i<=c;i++){
        if(c-i>=d[i]){//c-i是书架长度
            ans=min(ans,c-i);
        }
    }
    cout<<ans<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值