The Balance

【题目描述】

有一种天平,两个托盘都可以放置砝码,但它只有两种重量的砝码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\n",X,Y);
    }
    return 0;
}
posted @ 2016-10-26 19:04  前前前世。  阅读(227)  评论(0)    收藏  举报