Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 支付设备的算法现金支付的金额建议_Algorithm_Sorting_Dynamic Programming - Fatal编程技术网

Algorithm 支付设备的算法现金支付的金额建议

Algorithm 支付设备的算法现金支付的金额建议,algorithm,sorting,dynamic-programming,Algorithm,Sorting,Dynamic Programming,我做过背包问题等,但我不确定这个问题是否属于那个领域,不管怎样,如何解决它。问题是: 假设我们得到一组面额{1,2,10,20,50,100}。一位客户正在结账,并用现金付款。我们如何根据客户可能已交付的金额在我们自己的支付屏幕上建议前6名或前x名选择。例如,如果客户必须支付87美元,客户可能会交出5张100美元的钞票,或者4张20美元的钞票和一张5美元和一张2美元的钞票,等等,虽然我一直觉得这是关于背包的问题,但对于给定的值有多个答案?一个重要的问题是,您应该得到更具体的要求。和客户坐在一起,

我做过背包问题等,但我不确定这个问题是否属于那个领域,不管怎样,如何解决它。问题是:


假设我们得到一组面额{1,2,10,20,50,100}。一位客户正在结账,并用现金付款。我们如何根据客户可能已交付的金额在我们自己的支付屏幕上建议前6名或前x名选择。例如,如果客户必须支付87美元,客户可能会交出5张100美元的钞票,或者4张20美元的钞票和一张5美元和一张2美元的钞票,等等,虽然我一直觉得这是关于背包的问题,但对于给定的值有多个答案?

一个重要的问题是,您应该得到更具体的要求。和客户坐在一起,准备好例子并向他们提问是非常重要的:“我必须付87美元,我给你87x$1,好还是不好,为什么?”。从更明显的例子中你会得到:“什么比50x2或50+20+20更好,为什么?”。要创建任何东西的算法,您首先需要能够说出您作为一个人将如何进行(有无限的时间和极大的耐心),然后才能实现它

这里一个非常简单的指标是,你希望价值尽可能接近实际金额,而且你不想支付太多账单,对吗

因此,我们必须找到所有的解决方案,然后计算分数(账单越少,越接近目标值越好),按分数排序,并从最佳答案中选择“x”

您可以升级“分数”功能,即首选“10和20”账单,以便使用它们可以获得更好的分数。或者,较低的账单金额比目标值和账单总额之间的差异更重要,因此您对账单的处罚更重(就像每10美元的差异对1张账单的处罚相同)

这是基于回溯的javascript代码

//const countables=[100,50,20,10,2,1];
//const targetAmount=87;
常量可数=[5,2,1];
常数targetAmount=13;
施工费用=[];
常数解=[];
设指数=0;
让结束=错误;
设i=0;
while(end==false){
const sum=payments.reduce((prev,val)=>prev+val,0);
如果(总和>=targetAmount){
解决方案。推送({
总和
分数:计算分数(付款、目标金额、金额),
付款:[……付款],
})
索引++;
如果(索引===countables.length){
让popped=null;
做{
popped=payments.pop();
}而(popped==countables[countables.length-1]);
如果(payments.length==0){
结束=真;
}
const indexoflastnollowest=countables.indexOf(弹出);
指数=indexOfLastNonLowest+1;
}否则{
payments.pop();
}
}否则{
payments.push(可数[索引]);
}
}
函数计数核心(付款、目标数量、总和){
金额=付款。长度;
差值=总和-目标量;
退货金额+差额;
}
log(solutions.sort((a,b)=>a.score-b.score));
//const sortedSolutions=solutions.sort((a,b)=>a.score-b.score);
//常数bestSolutions=[];
//对于(var j=0;j<5;j++){
//bestSolutions.push(分类解决方案[j]);
// }

//console.log(最佳解决方案)您将如何确定这些是支付金额的前6种选择,使用dp您可以计算使用上述面额支付金额的方式有多少种,假设使用上述面额支付金额87美元的方式有8种,但我们如何确定这些是前6种选择等等。。。我们是否应该根据使用的高面额金额的使用情况对我们的选择进行排序?您的要求不清楚。是什么让选择比其他选择更好?5x100是否比4x80+1x20+1x5+x2或其他方式更好?究竟是如何决定哪些选项是“顶级的”?@libik,即使当我被问到时,Q的框架也很模糊,但有一个指标可以是使用更少的账单数量或最接近的金额——一个是顶级选择,或者两者兼而有之。对于87:选项1:4x20+2+5,选项2:4*20+10,选项3:5*x20@zenwraight,客户很少支付确切的金额,但这肯定是一个选择,我在top choices上回答了libik的类似Q。@curiousengineer如果时间复杂性不是一个约束,那么对于给定的输入金额n,您也可以运行递归函数,这将通过所有的组合,给你不同的答案。惊人的答案,你得到了正确的要求。我不太懂javascript,请问什么是
payments.reduce
doing?@curiousengineer-你不必知道确切的语法(你可以在谷歌上搜索它-javascript array reduce)。但它计算
payments
数组中所有值的总和。因此,如果你只是循环它和
sum+=payments[i]
,它将是相同的。但使用reduce时,它是一条直线。