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
HINT
Source
背包题
#include<stdio.h>
#include<string.h>
#include<iostream>
#include <algorithm>
using namespace std;
int m[10010],a[100010],flag[100010];
int main()
{
int N,i,j,sum,k,zl,sl;
while(~scanf("%d",&N)){
if(N==0) break; //别忘了
sum=0;
k=0;
memset(flag,0,sizeof(flag));
memset(m,0,sizeof(m));
for(i=0;i<N;i++){
scanf("%d%d",&zl,&sl);
sum+=zl*sl;
while(sl!=0){
a[k++]=zl;
sl--;
}
}
sort(a,a+k);
for(i=0;i<k;i++){
for(j=sum;j>=a[i];j--){
m[j]=max(m[j],m[j-a[i]]+a[i]);
flag[m[j]]=1;
}
}
for(i=1;i<=8500;i++){
if(flag[i]==0){
printf("%d\n",i);
break;
}
}
}
return 0;
}