在火星上,只有两种货币,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/
但我不确定为什么它没有被接受。如果我在这里错过了一些逻辑,请告诉我。
答案 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);