zcmu-1381: 简单题(多重背包——二进制优化)

题目描述

这里有不同重量的砝码 可以是1g,2g。。。现在给你一个数N表示有N种重量的砝码  ai。。。an表示重量  bi。。。bn表示数量  问你不能称量出最少几克的重量  (最大不超过8500克哦亲)

输入

第一行输入N表示砝码的重量种类(N=0结束)

接下来N行每行输入ai ,bi表示砝码的质量和数量(a<100,b<100)

输出

输出不能称量出的质量中最少的质量

样例输入

3

1 1

2 1

5 3

3

1 1

2 1

3 1

样例输出

4

7

注释:通过vector套结构体再配上二进制优化,让代码看起来更明白,本题的vi等于wi。

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
int dp[maxn];
int n;
struct ww{
    int vi;
    int wi;
};
int main(){
    while(~scanf("%d",&n)&&n!=0){
    memset(dp,0,sizeof(dp));
    vector<ww>goods;
    int sum=0;
    for(int i=0;i<n;i++){
        int a,b;
        scanf("%d %d",&a,&b);
        sum+=a*b;
        for(int k=1;k<=b;k*=2){
            b-=k;
            goods.push_back({a*k,a*k});
        }
        if(b>0)goods.push_back({a*b,a*b});
    }
    for(vector<ww>::iterator it = goods.begin(); it != goods.end(); it++){
        for(int i=sum;i>=(*it).vi;i--){
            dp[i]=max(dp[i],dp[i-(*it).vi]+(*it).wi);//转移方程
        }
    }
    for(int i=1;;i++){
        if(i!=dp[i]){
            cout<<i<<endl;break;
        }
    }
    goods.clear();
}
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

emo的鱼香roise

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值