poj2142-The Balance(扩展欧几里德算法)
2015-09-22 20:00
302 查看
一,题意:
有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品,
要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小。(注意:砝码位置有左右之分)。
二,思路:
1,砝码有左右位置之分,应对比两种情况
i,a左b右,得出方程 ax1 - by1 = d ;
ii,b左a右,得出方程 bx2 - ay2 = d 。
2,利用扩展欧几里德算法,解出(x1,y1)、(x2,y2),并求出最小x1和x2,以及相对应的y1,y2。
3,输出x1+y1和x2+y2 中的最小值。
三,步骤:
1,由题意得出两个方程
i,ax1 - by1 = d ;
ii,bx2 - ay2 = d 。
2,代入算法,解出两个方程的解(x1,y1)、(x2,y2),并求出最小x1和x2,以及相对应的y1,y2.
(详细步骤请参照本博客poj1061或者poj2115)。
3, 判断步骤
i,x1+y1最小时,输出x1,y1
ii,x2+y2最小时,输出y2,x2。 *此处为y2在前面输出,因为x2+y2最小时,第一个输入的a对应的是y2。
View Code
版权声明:本文为博主原创文章,未经博主允许不得转载。
有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品,
要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小。(注意:砝码位置有左右之分)。
二,思路:
1,砝码有左右位置之分,应对比两种情况
i,a左b右,得出方程 ax1 - by1 = d ;
ii,b左a右,得出方程 bx2 - ay2 = d 。
2,利用扩展欧几里德算法,解出(x1,y1)、(x2,y2),并求出最小x1和x2,以及相对应的y1,y2。
3,输出x1+y1和x2+y2 中的最小值。
三,步骤:
1,由题意得出两个方程
i,ax1 - by1 = d ;
ii,bx2 - ay2 = d 。
2,代入算法,解出两个方程的解(x1,y1)、(x2,y2),并求出最小x1和x2,以及相对应的y1,y2.
(详细步骤请参照本博客poj1061或者poj2115)。
3, 判断步骤
i,x1+y1最小时,输出x1,y1
ii,x2+y2最小时,输出y2,x2。 *此处为y2在前面输出,因为x2+y2最小时,第一个输入的a对应的是y2。
#include<iostream> #include<cmath> using namespace std; void exgcd(int a,int b,int& g,int& x,int& y){ //int& a 是定义一个存放整形变量a的地址 if(!b){ g = a ; x = 1 ; y = 0;} // g用来存储gcd(a,b)的值 else { exgcd(b , a%b , g , y , x) ; y -= x * (a/b) ; } } void work(int a , int b , int d ,int& g , int& x , int& y){ exgcd(a,b,g,x,y); //此处的x,y接收 ax+by=gcd(a,b)的值 x *= d/g; //求ax+by=c 的解x // y *= d/g; //求ax+by=c 的解y int t = b/g; x = (x%t + t) % t; //求出最小非负整数 y = abs( (a*x - d) / b); //求相对应的y,取绝对值是为了当左边砝码数 x 为零的时候,得出来的 y 是正整数。 /* //以下是先求y再求对应的x 。 int t = a/g; y = (y%t + t) % t; x = abs( (d + b*y) / a); */ } int main(){ int a,b,d,g,x1,x2,y1,y2; while(cin>>a>>b>>d){ if(a==0&&b==0&&d==0)break; work(a,b,d,g,x1,y1); work(b,a,d,g,x2,y2); if( x1+y1 < x2+y2 ) cout<<x1<<" "<<y1<<endl; else cout<<y2<<" "<<x2<<endl; //(注意顺序) } return 0; }
View Code
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- C#中多态问题
- 关于北京找工作的点滴记叙
- 黑马程序员——Swift学习笔记:声明与基本类型
- 黑马程序员——Swift学习笔记:声明与基本类型
- 返回的文件名不带扩展名
- POJ 3349 Snowflake Snow Snowflakes ( HASH+最小表示判同构 )
- Windows Performance Toolkit
- ZOJ 3328 Searching the String (AC自动机)
- SpringMVC设置缺省的返回数据格式
- 【作业二】结对项目之需求分析与原型模型设计
- 使用PL/SQL删除百万条记录的大表
- C语言程序初体验-第六课-第一题:两个正整数的正差值
- url 地址中的+(加号)问题
- n个灯,k个人的开灯问题
- linux c 字符判断函数
- iOS开发 ----- UIScrollview UIPageControl
- n个灯,k个人的开灯问题
- HDOJ 1018 Big Number (对数求位数)
- Android新建项目 默认布局改为 LinearLayout
- 【C语言】 字符串的内存拷贝处理函数