您的位置:首页 > 其它

砝码称重V2

2016-04-09 14:29 274 查看
[b]砝码称重V2[/b]总时间限制: 1000ms 内存限制: 65536kB描述
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=100,000),要求:计算用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。

输入一行,包括六个正整数a1,a2,a3,a4,a5,a6,表示1g砝码有a1个,2g砝码有a2个,……,20g砝码有a6个。相邻两个整数之间用单个空格隔开。输出以“Total=N”的形式输出,其中N为可以称出的不同重量的个数。样例输入1 1 0 0 0 0样例输出Total=3提示 样例给出的砝码可以称出1g,2g,3g三种不同的重量。

//转换成01背包
//转化成01背包问题。
//例:
//22=1+2+4+8+7(存于w[i]数组中)
//其中1,2,4,8能组成1~15中的任意值,再加7能组成1~22的任意值。
//f[j]=f[j]||f[j]-w[i];
//f[j]表示能否称出j;
#include<cstdio>
int a[100002]={0},n;
bool ans[100002];
int a1,a2,a3,a5,a10,a20;
void work(int x,int k){
int m=1;
while(x>m){
a[0]++;
a[a[0]]=m*k;
x-=m;
m=m<<1;
}
if(x>0) a[0]++,a[a[0]]=x*k;
}
int main(){
scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a5,&a10,&a20);
a[0]=0;
work(a1,1);
work(a2,2);work(a3,3);
work(a5,5);work(a10,10);work(a20,20);
ans[0]=1;
for(int i=1;i<=a[0];i++)
for(int j=100000;j>=a[i];j--){
ans[j]=ans[j]||ans[j-a[i]];
}
n=0;
for(int i=1;i<=100000;i++) if(ans[i]) n++;
printf("Total=%d\n",n);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: