我有貪婪算法,它解決了硬幣更換問題的所有可能的解決方案。硬幣的最大數量爲3。最小1. 例快速硬幣更換算法最多3個硬幣在C
隨着硬幣{1,2,3,4}我想使總和10個 所以方案產出
- ( 4 + 4 + 2)
- (3 + 3 + 4)
對於硬幣{4,5,8,3},總結12是
- (3 + 4 + 5)
- (4 + 4 + 4)
- (4 + 8)
等
問題是,我的算法效率非常低,因爲它涉及很多週期。我搜索了很多,但只找到算法,只顯示無數個硬幣的解決方案或硬幣變化的數量。
我的功能。硬幣按照升序排列。
void Count (int coins[], int cash, int n) {
int or = 3; // Begin with a+b+c for or=2 its a+b, or=1 its a
int i1,i2,i3;
int sum;
int result = 0;
if (coins[0]*3 > cash) {
or = 2;
}
if (coins[0]*2 < cash) {
for (i1 = 0; i1<n; i1++) {
if (or >= 2) {
for (i2 = i1; i2<n; i2++) {
if (or==3) {
sum = coins[i1] + coins[i2];
for (i3=i2; i3<n; i3++) {
if (sum+coins[i3] == cash) {
printf("%d = %d + %d + %d\n", cash, coins[i1], coins[i2], coins[i3]);
result++;
break;
} else if (sum+coins[i3] > cash) {
if (i3==i2 && i2==i1) {
or--;
i2 = -1;
i1 = 0;
} else if (i3==i2) {
i2 = n;
}
break;
}
}
} else {
sum = (coins[i1] + coins[i2]);
if (sum == cash) {
printf("%d = %d + %d\n", cash, coins[i1], coins[i2]);
result++;
} else if (sum > cash) {
if (i2==i1) {
or--;
i1 = -1;
}
break;
}
}
}
} else {
break;
}
}
}
int o;
if (coins[0]<=cash && coins[n-1] >= cash) {
for (o=0;o<n;o++) {
if (coins[o]==cash) {
printf("%d = %d\n", cash, coins[o]);
result++;
break;
}
}
}
printf("Result: %d\n", result);
}
您可以發佈您的代碼嗎?顯示你到目前爲止所做的。解釋你爲什麼認爲效率低下的原因。顯示[最小,完整且可驗證的示例](http://stackoverflow.com/help/mcve)。 – Tom