方法一:
题解:要按5分、2分、1分的个数从大到小排序,使用暴力枚举也从大数开始,然后i–。5分的个数最多的情况就是change/5,至少有一个所以i > 0,以此类推。
#include <stdio.h>
int main()
{
int x, i, j, k, count;
count = 0;
scanf("%d", &x);
for (i = x / 5; i > 0; i--)
for (j = x / 2; j > 0; j--)
for (k = x; k > 0; k--)
if (i * 5 + j * 2 + k == x)
{
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", i, j, k, i + j + k);
count++;
}
printf("count = %d\n", count);
return 0;
}
方法二:
算2元零钱时,扣掉5元的;算1元零钱时,扣掉5元和2元的。从而降低时间复杂度。
#include <stdio.h>
int main()
{
int change, i, j, k, count;
count = 0;
scanf("%d", &change);
for (i = change / 5; i > 0; i--)
for (j = (change - 5 * i) / 2; j > 0; j--)
for (k = (change - 5 * i - 2 * j); k > 0; k--)
if (5 * i + 2 * j + k == change)
{
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", i, j, k, i + j + k);
count++;
}
printf("count = %d\n", count);
return 0;
}