露米娅有一条很长很长的缎带,缎带的长度为n,她想要把缎带剪成一段一 段的小缎带,并且要满足: 1,每段小缎带长度为a或b或c。 2,小缎带的数量尽可能多。 ★数据输入 输入一行包括四个正整数n,a,b,c(1<=n,a,b,c<=4000),a,b,c可能相等。 ★结果输出 输出仅有一个数,为小缎带可能的最多数目,题目保证必有解。
错误
- # include<stdio.h>
- int main()
- {
- void swap(int x,int y);
- int a,b,c,n,i,j,t,max=0;
- scanf("%d %d %d %d",&n,&a,&b,&c);
- if(a>b){swap(a,b);}
- if(a>c){swap(a,c);}
- if(b>c){swap(b,c);}
- if(n%a==0)
- {
- max=n/a;
- }
- else
- {
- for(i=1;1;i++)
- {
- if((n-i*b)%a==0)
- {
- t=(n-i*b)/a +i;
- if(t>max)
- max = t;
- break;
- }
- }
- if(max!=0)
- {
- for(i=1;1;i++)
- {
- if((n-i*c)%a==0)
- {
- t=(n-i*c)/a +i;
- if(t>max)
- max = t;
- break;
- }
- }
- }
- if(max!=0)
- {
- for(i=1;1;i++)
- {
- for(j=1;1;j++)
- {
- if((n-i*c-j*b)%a==0)
- {
- t=(n-i*c-j*b)/a +i+j;
- if(t>max)
- max = t;
- break;
- }
- }
- }
- }
- if(max!=0)
- {
- for(i=1;1;i++)
- {
- for(j=1;1;j++)
- {
- if((n-i*b-j*c)%a==0)
- {
- t=(n-i*b-j*c)/a +i+j;
- if(t>max)
- max = t;
- break;
- }
- }
- }
- }
- }
- printf("%d",max);
- return 0;
- }
- void swap(int x,int y)
- {
- int t;
- t=x;
- x=y;
- y=t;
- }
- 四个for的蠢分类 全错!!!!
- 正确
- # include<stdio.h>
- int main()
- {
- int a,b,c,n,i,j,t,max=-1;
- scanf("%d %d %d %d",&n,&a,&b,&c);
- if(a>b){t=a;a=b;b=t;}
- if(a>c){t=a;a=c;c=t;}
- if(b>c){t=b;b=c;c=t;}
- for(i=0;1;i++) // n-(i×c)-(j*b) 与循环一起用 涵括了所有情况 i=0时各种 i=1时各种 等等
- {
- if((n-i*c) < 0) //尽量将循环终止条件写在循环开始前
- break;
- for(j=0;1;j++)
- {
- if( ( n-(i*c)-(j*b) ) < 0 ) //先判断 毕竟如果小于0就不能再运算 以免模一下出现不可预知的错误
- break;
- if((n-i*c-j*b)%a==0)
- {
- t =( n-i*c-j*b)/a +i+j;
- if(t>max)
- max = t;
- }
- }
- }
- printf("%d",max);
- return 0;
- }