将数字转换为另外两个数字的总和,因此差异最小

时间:2016-10-03 10:54:48

标签: javascript algorithm

  

在火星上,只有两种货币,x和y。一个   Marsian去了一家酒吧,账单是" z"。使用x和y他必须付钱   账单。但是酒吧不会有任何变化,任何额外的资金都将是   作为提示。

     

所以在JavaScript中编写一个函数,帮助marsian减少   提示。

     

该函数接受x,y,z并返回他所需的提示量   支付。

     

示例1

     

输入:2,5,109

     

输出:0

     

说明:21个硬币5个,2个硬币2个

     

示例2

     

输入:5,7,43

     

输出:0

     

说明:4个硬币7个,3个硬币5个

     

示例3

     

输入:15,19,33

     

输出:1

     

说明:1枚15枚硬币和1枚19枚硬币

解决方案:我认为这是一级DP问题,类似于子集和。就像找到较大数字的最佳提示一样,知道所有以下数字的最佳提示会有所帮助。

@Override
public void updateAdapterList(ItemsList itemsList);
{
   //update the adapter list -- assume your adapter is named "mAdapter"
   mAdapter.updateItemsList(itemsList);
}

Jsfiddle:https://jsfiddle.net/7c4sbe46/

但我不确定为什么它没有被接受。如果我在这里错过了一些逻辑,请告诉我。

4 个答案:

答案 0 :(得分:1)

它与diophantine equations更相关,即是否有解决方案a.x + b.y = z?如果z是x和y的最大公约数的倍数(称为gcd),答案是肯定的。如果没有,你的提示将是1之间的差异。可以被gcd整除并且大于z的较小数字 和2. z。 一旦你知道了提示的价值,你甚至可以通过稍微修改z到(z + tip)的值来轻松地知道你需要的x和y的数量。

答案 1 :(得分:0)

#include <stdio.h>
int main()
{
int curr1, curr2, bill;

scanf("%d %d %d",&curr1,&curr2,&bill);

int gcd, tip=0;
int x=curr1;
int y=curr2;
while(x!=y)
{
    if(x > y)
        x -= y;
    else
        y -= x;
}
gcd=x;

 if((bill%curr1==0) || (bill%curr2==0) || (bill%(curr1 + curr2)==0)){
   tip = 0;  
 } else if(bill>(curr1 + curr2) && (bill % gcd==0)) {
   tip = 0;
 } else if((curr1 + curr2) > bill){
     if(curr2 > curr1){
          tip = (bill % (curr2-curr1));
     }else{
          tip = (bill % (curr1-curr2));     
     }
 }
 printf("%d",tip);
 return 0;
}

答案 2 :(得分:0)

没有必要为此使用dp。这是一个简单的解决方案 -

// x -> first currency denomination
// y -> second currency denomination
// z -> total bill

var calculateTip = function(x,y,z) {
  var xMax = Math.floor(z/x);
  var tip = y;
  if(xMax == 0) {
    tip = (x-z) < (Math.ceil(z/y)*y - z) ? (x-z) : (Math.ceil(z/y)*y - z);
  }
  while (xMax>=0) {
    var tempTip = xMax*x + Math.ceil((z-xMax*x)/y)*y - z;
    if(tempTip < tip) {
        tip = tempTip;
    }
    xMax--;
  }
  return tip;
}



var minimumTip = function(x,y,z) {
  if(x>y) { 
    return calculateTip(x,y,z);     
  } else {
    return calculateTip(y,x,z);
  }
}

console.log(minimumTip(2, 5, 109));

答案 3 :(得分:0)

var findTip = function(x=2, y=5, z=13){
var x = x;
var y = y; 
var z = z;
var tip ;
var temp1 = x;
var temp2 = y
function findNumber(num,total){
  if(num > total){
    return num-total;
   }
   else{
     var q = Math.floor(total/num);
     return ((q+1)*num)-total;
   }
}
function findMin(a,b,c){
  var min ;
  if(a<b && a<c){
    min = a
  }else{
    if(b<c){
      min = b;
    }else{
      min = c;
    }
  }
  return min;
}
while(temp1!=temp2)
{
    if(temp1 > temp2)
        temp1 -= temp2;
    else
        temp2 -= temp1;
}
var factor =temp1;
if(z%x == 0 || z%y == 0 || z%(x+y) == 0) {
  tip = 0;
}else if(z%factor == 0 && z>=x*y - x -y){
  tip = 0;
}
else {
  var minX= findNumber(x,z);
  var minY = findNumber(y,z);
  var minXY = findNumber(x+y,z);
  console.log(minX,minY,minXY)
  tip = findMin(minX,minY,minXY);
}
alert('the tip is '+ tip.toString());
return tip;
}
findTip(21, 11, 109);