题目描述
一个人有一种天平,这种天平只有两种重量的砝码a和b,现在要称出重量为c的物品,问你至少需要多少a和b,答案需要满足a的数量加上b的数量和最小,并且他们的重量和也要最小。(两个盘都可以放砝码)
题解
#include <cmath>
#include<iostream>
#include <cstdio>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if(b==0){
x=1;
y=0;
return a;
}
int ans=exgcd(b,a%b,x,y);
int ccc=x;
x=y;
y=ccc-a/b*y;
return ans;
}
int main()
{
int a,b,c;
int x,y,x0,y0;
while(cin>>a>>b>>c){
if(!a&&!b&&!c) break;
bool f=false;
if(a<b) swap(a,b),f=true;
int d=exgcd(a,b,x,y);
x0=x*c/d,y0=y*c/d;
int t=d*y0/a;
a=a/d,b=b/d;
int add=1e8,mul=1e8;
int ansx,ansy;
for(int i=t-1;i<=t+1;i++){
x=x0+i*b;
y=y0-i*a;
x=abs(x);
y=abs(y);
if(x+y<add){
add=x+y;
ansx=x;
ansy=y;
mul=a*x+b*y;
}
else if(x+y==add){
if(a*x+b*y<mul){
ansx=x;ansy=y;
mul=a*x+b*y;
}
}
}
if(!f) printf("%d %d\n",ansx,ansy);
else printf("%d %d\n",ansy,ansx);
}