-7
這可能聽起來不那麼容易,但我無法理解它。 我想製作一臺自動售貨機,直到現在一直非常簡單,但我怎麼給用戶交換最少量的硬幣?問題出現在用戶比產品價格更多的錢上。如果可樂是2美元,用戶給4美元,自動售貨機應該支付2美元或2美元的費用如何改變最少數量的硬幣/賬單?
這可能聽起來不那麼容易,但我無法理解它。 我想製作一臺自動售貨機,直到現在一直非常簡單,但我怎麼給用戶交換最少量的硬幣?問題出現在用戶比產品價格更多的錢上。如果可樂是2美元,用戶給4美元,自動售貨機應該支付2美元或2美元的費用如何改變最少數量的硬幣/賬單?
這種方法將檢查每個解決方案並返回最好的一個。值數組是按升序排列的每個硬幣/賬單的值。可用性是分銷商可用的硬幣/票據數量。
private static int[] bestChange(int amount, int[] value,
int[] availability) {
int[] change = new int[value.length];
int[] best = null;
int i = value.length;
int m = amount;
outer:
while (true) {
--i;
int v = value[i];
int n = Math.min(m/v, availability[i]);
change[i] = n;
m -= n*v;
if (m == 0) {
System.out.println("Solution found: "
+ toString(change, value));
if (best == null || isBest(change, best)) {
System.out.println(" best so far");
best = change.clone();
}
}
if (i == 0 || m == 0) {
m += n*v;
change[0] = 0;
do {
++i;
if (i == value.length) {
break outer;
}
} while (change[i] == 0);
--change[i];
m += value[i];
}
}
return best;
}
如果標準是硬幣/紙幣的數量最少,最終的決定的方法是這樣的:
private static boolean isBest(int[] change, int[] best) {
return count(change) < count(best);
}
private static int count(int[] change) {
int n = 0;
for (int c: change) {
n += c;
}
return n;
}
注意,大部分的時間,第一個解決方案也是最好的;因此找到解決方案後可能不值得繼續。
歡迎來到Stack Overflow!請[參觀](http://stackoverflow.com/tour)以查看網站的工作原理和問題,並相應地編輯您的問題。另請參閱:[爲什麼「有人可以幫我嗎?」不是一個真正的問題?](http://meta.stackoverflow.com/q/284236) –
***這可能聽起來不那麼容易...... ***甚至聽起來不像軟件開發問題/問題... –
請發佈您的相關代碼或完整的描述你的問題,人們將能夠幫助你。 –