【题目描述】
有一种天平,两个托盘都可以放置砝码,但它只有两种重量的砝码A、B,现需要称出重量为C的物品,询问至少需要多少个砝码A、B,并且使其重量总和最小。
【输入描述】
输入多组数据,每组数据格式如下:
输入三个数A、B、C(A ≠ B,A,B <= 10000,C <= 50000);
最后一行输入“0 0 0”。
【输出描述】
对于每组数据,输出一行,包含两个数,分别表示砝码A、B的数量。
【输入样例】
700 300 200
500 200 300
500 200 500
275 110 330
275 110 385
648 375 4002
3 1 10000
0 0 0
【输出样例】
1 3
1 1
1 0
0 3
1 1
49 74
3333 1
源代码: #include<cstdio> int X,Y,T1,T2; int GCD(int t1,int t2) { return t2?GCD(t2,t1%t2):t1; } void ExGCD(int t1,int t2) { if (!t2) { X=1; Y=0; } else { ExGCD(t2,t1%t2); int t=X; X=Y; Y=t-t1/t2*Y; } } int main() { int A,B,C; while (~scanf("%d%d%d",&A,&B,&C)) { if (!(A+B+C)) //特判。 break; int D=GCD(A,B); A/=D; B/=D; C/=D; ExGCD(A,B); //老规矩。 T1=(X*C%B+B)%B; //求x最小值。 T2=(C-A*T1)/B; //更新y。 T2*=T2<0?-1:1; //天平两旁都可放。 Y=(Y*C%A+A)%A; //求y最小值。 X=(C-B*Y)/A; //更新x。 X*=X<0?-1:1; //天平两旁都可放。 if (X+Y>T1+T2) //贪心比较。 { X=T1; Y=T2; } printf("%d %d ",X,Y); } return 0; }