问题描述:设有1克、2克、5克、10克、20克、50克的砝码各一枚,问使用这些砝码在天平上可称出多少种不同的重量?
要求:1)输出可以称出的所有重量数;
2)对每种可以称出的重量数给出如何称出的方法解释。
请给出具体的程序代码和算法解释 ,谢谢!
其实不需要气馁,跟编程“菜”否还就没有太大关系哩。
首先,不要想得太复杂:暂时只考虑砝码放在同一侧。
于是就联想到多个数字的“连加”运算:
形成最大重量可不就是全部相加,是不?
怎样产生一般化的重量呢?显然就是
一部分上托盘,另一部分休息。
因此就联想到“排列组合”知识,是不?
是排列还是组合呢?是排列!因为加法运算
遵守交换律。。。。。。。。。。。。。。。
总之,战略上要藐视难题,要有解题的勇气;
战术上则要步步为营、稳扎稳打。寻找适合
自己的突破口,有所斩获。
/*仅考虑砝码放在同一个托盘*/
#include<stdio.h>
#include<string.h>
main()
{
int a,b,c,x,y,z;
for(z=0;z<=1;z++)
for(y=0;y<=1;y++)
for(x=0;x<=1;x++)
for(c=0;c<=1;c++)
for(b=0;b<=1;b++)
for(a=0;a<=1;a++)
{ int wt=0,len;
char s[80]={0};
if(a){wt+=1;strcat(s,"1+");}
if(b){wt+=2;strcat(s,"2+");}
if(c){wt+=5;strcat(s,"5+");}
if(x){wt+=10;strcat(s,"10+");}
if(y){wt+=20;strcat(s,"20+");}
if(z){wt+=50;strcat(s,"50+");}
len=strlen(s);
if(len==0)continue;
s[len-1]='=';
printf("%s%d\n",s,wt);
}
}
运行情况如下
1=1
2=2
1+2=3
5=5
1+5=6
2+5=7
1+2+5=8
10=10
1+10=11
2+10=12
1+2+10=13
5+10=15
1+5+10=16
2+5+10=17
1+2+5+10=18
20=20
1+20=21
2+20=22
1+2+20=23
5+20=25
1+5+20=26
2+5+20=27
1+2+5+20=28
10+20=30
1+10+20=31
2+10+20=32
1+2+10+20=33
5+10+20=35
1+5+10+20=36
2+5+10+20=37
1+2+5+10+20=38
50=50
1+50=51
2+50=52
1+2+50=53
5+50=55
1+5+50=56
2+5+50=57
1+2+5+50=58
10+50=60
1+10+50=61
2+10+50=62
1+2+10+50=63
5+10+50=65
1+5+10+50=66
2+5+10+50=67
1+2+5+10+50=68
20+50=70
1+20+50=71
2+20+50=72
1+2+20+50=73
5+20+50=75
1+5+20+50=76
2+5+20+50=77
1+2+5+20+50=78
10+20+50=80
1+10+20+50=81
2+10+20+50=82
1+2+10+20+50=83
5+10+20+50=85
1+5+10+20+50=86
2+5+10+20+50=87
1+2+5+10+20+50=88
Press any key to continue