poj 2142 The Balance(扩展欧几里德算法)
2016-03-09 20:17
246 查看
题意:有两种类型的砝码,每种的砝码质量a和b,现在要求称出质量为d的物品,天平两侧都可以放砝码,要求a的数量x和b的数量y最小,以及x+y的值最小。
#include <cstdio> #include <cmath> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> #include <iostream> using namespace std; int a,b,c,x,y; int exgcd(int a,int b) { int t,d; if(b==0) { x=1; y=0; return a; } d=exgcd(b,a%b); t=x; x=y; y=t-(a/b)*y; return d; } int main() { int sum1,sum2,ans1,ans2; int a1,b1,c1; while(scanf("%d%d%d",&a,&b,&c),a||b||c) { int d=exgcd(a,b); a1=a/d; b1=b/d; c1=c/d; x=x*c/d; y=y*c/d; sum1=abs(x)+abs(y); sum2=abs(x)*a+abs(y)*b; ans1=abs(x); ans2=abs(y); for(int i=-50000; i<=50000; i++) // x1=x+b/d*t; y1=y-a/d*t; { int s1=abs(x+i*b1)+abs(y-i*a1); int s2=abs(x+i*b1)*a+abs(y-i*a1)*b; if(s1<sum1||s1==sum1&&s2<sum2) { sum1=s1; sum2=s2; ans1=abs(x+i*b1); ans2=abs(y-i*a1); } } printf("%d %d\n",ans1,ans2); } return 0; }
相关文章推荐
- 56-题目1087:约数的个数
- 【dotnet跨平台】"dotnet restore"和"dotnet run"都做了些什么?
- 命令行解决mysql中文乱码
- 竖式问题
- Okhttp的简单介绍和使用(一)
- 华为oj 求二叉树的深度和宽度
- could improve 125. Valid Palindrome
- Andrroid 面试问题问答
- ALGO-124 数字三角形 动态规划
- Linux上安装Oracle11g
- C语言-switch语句
- PID 入门形象理解
- iOS开发笔记(6)---- 应用内接入银联ApplePay
- 278. First Bad Version
- actor发送消息简单例子
- Linux 驱动开发之内核模块开发 (二)—— 内核模块编译 Makefile 入门
- 全局负载均衡技术如何将用户的访问指向离用户最近的工作正常的流媒体服务器上
- UML的9种图例解析
- Link-Cut-Tree模板
- 168. Excel Sheet Column Title