• poj2142-The Balance(扩展欧几里德算法)


    一,题意:
      有两个类型的砝码,质量分别为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。

     1 #include<iostream>
     2 #include<cmath>
     3 using namespace std;
     4 
     5 void exgcd(int a,int b,int& g,int& x,int& y){  //int& a 是定义一个存放整形变量a的地址
     6     if(!b){ g = a ; x = 1 ; y = 0;}                   // g用来存储gcd(a,b)的值 
     7     else { exgcd(b , a%b , g , y , x) ; y -= x * (a/b) ; }
     8 }
     9 
    10 void work(int a , int b , int d ,int& g , int& x , int& y){
    11     exgcd(a,b,g,x,y);      //此处的x,y接收 ax+by=gcd(a,b)的值 
    12     x *= d/g;             //求ax+by=c 的解x 
    13 //    y *= d/g;            //求ax+by=c 的解y    
    14     int t = b/g;         
    15     x = (x%t + t) % t;       //求出最小非负整数 
    16     y = abs( (a*x - d) / b);  //求相对应的y,取绝对值是为了当左边砝码数 x 为零的时候,得出来的 y 是正整数。 
    17 /* //以下是先求y再求对应的x 。 
    18     int t = a/g;     
    19     y = (y%t + t) % t;
    20     x = abs( (d + b*y) / a);
    21 */
    22 }
    23 
    24 int main(){
    25     int a,b,d,g,x1,x2,y1,y2;
    26     while(cin>>a>>b>>d){
    27         if(a==0&&b==0&&d==0)break;
    28         work(a,b,d,g,x1,y1);
    29         work(b,a,d,g,x2,y2);
    30         if( x1+y1 < x2+y2 )
    31             cout<<x1<<" "<<y1<<endl; 
    32         else
    33             cout<<y2<<" "<<x2<<endl;   //(注意顺序)
    34     }
    35     return 0;
    36 }
    View Code

       版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    PHP之目录遍历
    PHP之验证码
    PHP之验证码
    PHP之异常处理模式
    PHP之pdo的预处理模式
    PHP之PDO
    PHP之cookie和session
    PHP之MVC
    单例模式
    ThreadLocal
  • 原文地址:https://www.cnblogs.com/My-Sunshine/p/4830171.html
Copyright © 2020-2023  润新知