Javascript 将一个数转换为另外两个数的和,使差值最小

Javascript 将一个数转换为另外两个数的和,使差值最小,javascript,algorithm,Javascript,Algorithm,在火星上,只有两种面额的货币,x和y。A. Marsian去了一家酒吧,账单上写着“z”。用x和y他必须付钱 法案。但是酒吧不提供零钱,任何额外的钱都会被扣除 作为提示 因此,用JavaScript编写一个函数,帮助marsian减少 提示 该函数接受x、y、z并返回他必须支付的小费金额 付钱 例1 输入:2,5109 输出:0 说明:21枚5枚硬币和2枚2枚硬币 例2 输入:5,7,43 输出:0 说明:7枚硬币中有4枚,5枚硬币中有3枚 例3 输入:15、19、33 产出:1 说明:1枚15

在火星上,只有两种面额的货币,x和y。A. Marsian去了一家酒吧,账单上写着“z”。用x和y他必须付钱 法案。但是酒吧不提供零钱,任何额外的钱都会被扣除 作为提示

因此,用JavaScript编写一个函数,帮助marsian减少 提示

该函数接受x、y、z并返回他必须支付的小费金额 付钱

例1 输入:2,5109

输出:0

说明:21枚5枚硬币和2枚2枚硬币

例2 输入:5,7,43

输出:0

说明:7枚硬币中有4枚,5枚硬币中有3枚

例3 输入:15、19、33

产出:1

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

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

const coinA = 2
const coinB = 5
const sum = 13

var arr = [];
arr[0] =0;
console.log(getMyTip(coinA, coinB, sum));
function getMyTip(){
    for(var i=1; i<= sum; i++){
        var minA, minB;
        if( i < coinA){
          minA = coinA - i;
        }else{
          minA = arr[i - coinA];
        }
        if( i < coinB){
         minB = coinB - i;
        }else{
         minB = arr [i - coinB]
        }
        arr[i] = Math.min(minA, minB);
    }
    return arr[sum];

}
const coinA=2
常数b=5
常数和=13
var-arr=[];
arr[0]=0;
log(getMyTip(coinA,coinB,sum));
函数getMyTip(){
对于(var i=1;i而言,它与a.x+b.y=z有更密切的关系吗?如果z是x和y的最大公约数(称为gcd)的倍数,答案是肯定的。如果不是,你的提示将是1.可被gcd整除的较小数字与大于z的数字之间的差
和2.z。
一旦您知道了提示的值,您甚至可以通过稍微将z的值修改为(z+tip)来轻松地知道所需的x和y的数量
int main()
{
国际货币1、2、票据;
scanf(“%d%d%d”、&curr1、&curr2、&bill);
int gcd,tip=0;
int x=curr1;
int y=curr2;
while(x!=y)
{
如果(x>y)
x-=y;
其他的
y-=x;
}
gcd=x;
如果((票据%curr1==0)| |(票据%curr2==0)| |(票据%(curr1+curr2)==0)){
tip=0;
}否则,如果(票据>(当前1+当前2)和&(票据%gcd==0)){
tip=0;
}如果((当前1+当前2)>账单){
如果(curr2>curr1){
小费=(账单%(当前2-当前1));
}否则{
小费=(账单%(curr1-curr2));
}
}
printf(“%d”,提示);
返回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));
/x->第一种货币面额
//y->第二种货币面额
//z->总账单
var CalculateIP=函数(x,y,z){
var xMax=数学楼层(z/x);
var-tip=y;
如果(xMax==0){
提示=(x-z)<(数学单元(z/y)*y-z)?(x-z):(数学单元(z/y)*y-z);
}
而(xMax>=0){
var TENTIP=xMax*x+Math.ceil((z-xMax*x)/y)*y-z;
如果(IPy){
返回计算IP(x,y,z);
}否则{
返回计算IP(y,x,z);
}
}
控制台日志(最小提示(2,5,109));
var findTip=函数(x=2,y=5,z=13){
var x=x;
变量y=y;
var z=z;
var-tip;
var-temp1=x;
var temp2=y
函数findNumber(num,total){
如果(数量>总数){
返回总数;
}
否则{
var q=数学楼层(总计/数量);
返回((q+1)*num)-总计;
}
}
函数findMin(a,b,c){
var-min;

如果(Ayple函数不使用参数化这个JavaScript?也许你应该考虑添加解释……)
// 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));
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);