题目描述
这里有不同重量的砝码 可以是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;
}