首页 > 代码库 > 剪缎带

剪缎带

露米娅有一条很长很长的缎带,缎带的长度为n,她想要把缎带剪成一段一 段的小缎带,并且要满足: 1,每段小缎带长度为a或b或c。 2,小缎带的数量尽可能多。 ★数据输入 输入一行包括四个正整数n,a,b,c(1<=n,a,b,c<=4000),a,b,c可能相等。 ★结果输出 输出仅有一个数,为小缎带可能的最多数目,题目保证必有解。

错误

  1.             # include<stdio.h>  
  2. int main()  
  3. {  
  4.   void swap(int x,int y);  
  5.   int a,b,c,n,i,j,t,max=0;  
  6.   scanf("%d %d %d %d",&n,&a,&b,&c);  
  7.   if(a>b){swap(a,b);}  
  8.   if(a>c){swap(a,c);}  
  9.   if(b>c){swap(b,c);}  
  10.     
  11.   if(n%a==0)  
  12.   {  
  13.     max=n/a;  
  14.   }  
  15.   else   
  16.   {  
  17.        for(i=1;1;i++)  
  18.        {  
  19.           if((n-i*b)%a==0)  
  20.           {  
  21.                 t=(n-i*b)/a +i;  
  22.                 if(t>max)  
  23.                 max = t;  
  24.                 break;  
  25.           }  
  26.        }  
  27.        if(max!=0)  
  28.      {  
  29.        for(i=1;1;i++)  
  30.        {  
  31.           if((n-i*c)%a==0)  
  32.           {  
  33.                 t=(n-i*c)/a +i;  
  34.                 if(t>max)  
  35.                 max = t;  
  36.                 break;  
  37.           }  
  38.        }  
  39. }  
  40.          if(max!=0)  
  41.     {  
  42.        for(i=1;1;i++)  
  43.        {  
  44.           for(j=1;1;j++)  
  45.           {  
  46.              if((n-i*c-j*b)%a==0)  
  47.                 {  
  48.                     t=(n-i*c-j*b)/a +i+j;  
  49.                 if(t>max)  
  50.                 max = t;  
  51.                 break;  
  52.                 }     
  53.           }  
  54.        }  
  55. }  
  56.          if(max!=0)  
  57.     {  
  58.         for(i=1;1;i++)  
  59.        {  
  60.           for(j=1;1;j++)  
  61.           {  
  62.              if((n-i*b-j*c)%a==0)  
  63.                 {  
  64.                     t=(n-i*b-j*c)/a +i+j;  
  65.                 if(t>max)  
  66.                 max = t;  
  67.                 break;  
  68.                 }     
  69.           }  
  70.        }  
  71. }  
  72.          
  73.          
  74.   }  
  75.     
  76.   printf("%d",max);  
  77.   return 0;  
  78.     
  79. }  
  80.   
  81. void swap(int x,int y)  
  82. {  
  83.      int t;  
  84.      t=x;  
  85.      x=y;  
  86.      y=t;  
  87. }  
  88.   四个for的蠢分类  全错!!!!

 

  1.   正确
    1.    # include<stdio.h>  
    2. int main()  
    3. {  
    4.   int a,b,c,n,i,j,t,max=-1;  
    5.   scanf("%d %d %d %d",&n,&a,&b,&c);  
    6.   if(a>b){t=a;a=b;b=t;}  
    7.   if(a>c){t=a;a=c;c=t;}  
    8.   if(b>c){t=b;b=c;c=t;}  
    9.   
    10.     
    11.   for(i=0;1;i++)    // n-(i×c)-(j*b) 与循环一起用  涵括了所有情况  i=0时各种 i=1时各种   等等
    12.        {  
    13.         if((n-i*c) < 0)   //尽量将循环终止条件写在循环开始前
    14.           break;  
    15.           for(j=0;1;j++)  
    16.           {  
    17.             if( ( n-(i*c)-(j*b) ) < 0 )    //先判断 毕竟如果小于0就不能再运算 以免模一下出现不可预知的错误
    18.                  break;  
    19.              if((n-i*c-j*b)%a==0)  
    20.                 {  
    21.                     t =( n-i*c-j*b)/a +i+j;  
    22.                 if(t>max)  
    23.                 max = t;  
    24.                 }  
    25.               
    26.           }  
    27.             
    28.        }  
    29.   
    30.   
    31.   printf("%d",max);  
    32.   return 0;  
    33.     
    34. }  
  1.  

剪缎带