Một bảng tra cứu là một phương pháp tốt.
int[] Coins = new[] { 100, 50, 25, 10, 5, 1 };
int[,] Table = new int[6,6400];
/// Calculate the number of coins of each type that minimizes the number of
/// tubes used.
int[] Tubes(int cents)
{
int[] counts = new int[Coins.Length];
if (cents >= 6400)
{
counts[0] += (cents/6400) * 64; // number of coins in filled $1-tubes
cents %= 6400;
}
for (int i = 0; i < Coins.Length; i++)
{
int count = Table[i, cents]; // N coins in (N + 63)/64 tubes
counts[i] += count;
cents -= count * Coins[i];
}
return cents;
}
Để tính bảng, bạn có thể sử dụng này:
void CalculateTable()
{
for (int i = Coins.Length-1; i >= 0; i--)
{
int coin = Coins[i];
for (int cents = 0; cents < 6400; cents++)
{
if (i == Coins.Length-1)
{
// The 1 cent coin can't be divided further
Table[i,cents] = cents;
}
else
{
// Find the count that minimizes the number of tubes.
int n = cents/coin;
int bestTubes = -1;
int bestCount = 0;
for (int count = cents/coin; count >= 0; count--)
{
int cents1 = cents - count * coin;
int tubes = (count + 63)/64;
// Use the algorithm from Tubes() above, to optimize the
// lesser coins.
for (int j = i+1; j < Coins.Length; j++)
{
int count1 = Table[j, cents1];
cents1 -= count1 * Coins[j];
tubes += (count1 + 63)/64;
}
if (bestTubes == -1 || tubes < bestTubes)
{
bestTubes = tubes;
bestCount = count;
}
}
// Store the result
Table[i,cents] = bestCount;
}
}
}
}
CalculateTable
chạy trong một vài mili giây, vì vậy bạn không cần phải lưu nó vào đĩa.
Ví dụ:
Tubes(3149) -> [ 31, 0, 0, 0, 0, 49]
Tubes (3150) -> [ 0, 63, 0, 0, 0, 0]
Tubes (31500) -> [315, 0, 0, 0, 0, 0]
Những con số có nghĩa là số tiền xu. N đồng tiền có thể được đưa vào (N + 63)/64 ống.
Dường như cách tiếp cận bạo lực đơn giản nên đủ tốt, trừ khi bạn muốn xử lý số tiền rất lớn? –
Thành thật? Tôi rất mới để lập trình và ít có ý tưởng bắt đầu từ đâu, tôi đã cố gắng suy nghĩ về việc thay đổi cách tiếp cận tham lam, đã nghĩ về vấn đề bạo lực nhưng tôi gặp khó khăn ngay cả khi kết hợp với số tiền hoặc tìm kiếm Ví dụ (về cách để có được sự kết hợp của tiền xu từ một số tiền) mà tôi có thể hiểu được. Tôi vừa tìm thấy một ví dụ về stackoverflow mà tôi có thể làm theo vì vậy tôi sẽ cập nhật ngay. –
Ví dụ 25 xu có thể được thực hiện với 25 xu 1c trong một ống không? –