标签:
题意:有两种类型的砝码,每种的砝码质量a和b给你,现在要求称出质量为c的物品,要求a的数量x和b的数量y最小,以及x+y的值最小。
用扩展欧几里德求ax+by=c,求出ax+by=1的一组通解,求出当x取最小合法正整数解时y的取值,当y小于0时,说明应该放在a的另一边,变为正值。同理当y取最小时,可得到另一组解,比较两组解,取最小即可。
#include<stdio.h> int ex_gcd(int a,int b,int &x,int &y){ if(!b){ x=1,y=0; return a; } int ans=ex_gcd(b,a%b,y,x); y-=a/b*x; return ans; } void cal(int a,int b,int c){ int x,y,xx,yy; int d=ex_gcd(a,b,x,y); xx=x,yy=y; a/=d,b/=d,c/=d; x=((x*c)%b+b)%b; y=(c-a*x)/b; if(y<0) y=-y; yy=((yy*c)%a+a)%a; xx=(c-b*yy)/a; if(xx<0) xx=-xx; if(x+y>xx+yy) x=xx,y=yy; printf("%d %d\n",x,y); } int main(){ int a,b,c; while(~scanf("%d%d%d",&a,&b,&c)){ if(!a&&!b&&!c) break; cal(a,b,c); } return 0; }
标签:
原文地址:http://www.cnblogs.com/L-King/p/5719664.html