Description
这里有不同重量的砝码 可以是1g,2g。。。现在给你一个数N表示有N种重量的砝码 ai。。。an表示重量 bi。。。bn表示数量 问你不能称量出最少几克的重量 (最大不超过8500克哦亲)
Input
第一行输入N表示砝码的重量种类(N=0结束)
接下来N行每行输入ai ,bi表示砝码的质量和数量(a<100,b<100)
Output
输出不能称量出的质量中最少的质量
Sample Input
3
1 1
2 1
5 3
3
1 1
2 1
3 1
Sample Output
4
7
#include<bits/stdc++.h>
using namespace std;
#define pi acos(-1)
#define mod 998244353
#define INF 0x3f3f3f
#define fi first
#define se second
#define it iterator
#define ins insert
#define mp make_pair
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define np next_permutation
#define ll long long
#define ull unsigned long long
#define mem(a) memset(a,0,sizeof(a))
#define cio ios::sync_with_stdio(false)
#define gcd __gcd
ll lgcd(ll a,ll b){return b == 0? a:lgcd(b, a % b);}
int lowbit(int x){return x&(-x);}
#define T int t;scanf("%d",&t);while(t--)
#define Ce cout << endl
#define CE(n) cout << n << endl
#define C(n) cout << n;
#define CY cout << "YES" <<
#define CN cout << "NO" << endl
#define Cy cout << "Yes" << endl
#define Cn cout << "No" << endl
int dp[10010];
int a[100010];
int q[100010];
int main()
{
int n;
while(cin>>n){
if(n==0) break;
int sum = 0;
int k = 0;
int x, y;
for(int i = 0; i < n; i++){
cin >> x >> y;
sum += x*y;
while(y!=0){ // 转化为01背包
a[k++] = x;
y--;
}
}
sort(a,a+k);
mem(q);
mem(dp);
for(int i = 0; i < k; i++){
for(int j = sum; j >= a[i]; j--){
dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
q[dp[j]] = 1; // 标记每个能称出的重量
}
}
for(int i = 1; i <= 8500; i++){
if(q[i]==0){ // 从小到大遍历输出第一个为0(不能称出的重量)的数
CE(i);
break;
}
}
}
return 0;
}