C语言穷举法解决破碎的砝码

1.问题描述
    一天商人不小心把40磅重的砝码摔成4部分,发现4部分砝码的重量都是整磅数,而且可以用它们称出任意1-40之间的整数磅质量,问这四块砝码各重多少磅?
 
2.该问题的数学分析

   ①必须有1磅的砝码,否则39磅的重量无法称出.
   ②有了1磅的砝码后,再加上一个3磅的砝码,可称出2~4磅的重量.
   ③有了1磅和3磅的砝码后,再加上一个9磅的砝码,可称出5~13磅的重量.
   ④有了1、3、9磅的砝码后,再加上一个27磅的砝码,可称出14~40磅的重量.
   所以这4块砝码碎片分别是1、3、9、27磅,即首项为1,公比为3的等比数列.

 1 #include <stdio.h>
 2 
 3 int check(int a,int b,int c,int d,int i);
 4 
 5 int main(int argc, char *argv[])
 6 {
 7     int a,b,c,d,i;            //四块砝码重量
 8     for(a=1;a<40;a++)
 9         for(b=a+1;b<40;b++)
10             for(c=b+1;c<40;c++)
11                 for(d=c+1;d<40;d++)
12                     //使用这种循环可以防止重复,比如1234,和4321数字相同,顺序不同 
13                     if( (a+b+c+d) == 40){
14                         int flag=1;            //标志变量 
15                         for(i=1;i<=40;i++){
16                             if(!check(a,b,c,d,i)) flag=0;    //如果有一个i不符合 
17                         }                         
18                         if(flag)            //flag=1说明所有的i都符合 
19                             printf("%d %d %d %d\n",a,b,c,d);    
20                     }
21                     
22     return 0;
23 }
24 
25 //检查四块碎片是否符合条件 
26 int check(int a,int b,int c,int d,int i){
27     int x1,x2,x3,x4;
28         for(x1=-1;x1<=1;x1++)    
29             for(x2=-1;x2<=1;x2++)    
30                 for(x3=-1;x3<=1;x3++)    
31                     for(x4=-1;x4<=1;x4++)
32                         if( (a*x1+b*x2+c*x3+d*x4 == i)) 
33                             return 1;
34                             
35                                     
36         return 0; 
37 }

 输出:

1 3 9 27

posted @ 2016-07-28 11:44  阿豪boy  阅读(1114)  评论(0编辑  收藏  举报