问题描述
100元钱,有几种零钱,比如1元,5元,10元,求有几种组合
分析
时间复杂度O(m*n),空间复杂度O(n),完全背包问题
代码如下
1 #include <stdio.h> 2 #define N 100 3 int a[N + 5]; 4 int change[4]; //有几种零钱 5 //主功能函数,找到一共需要几种零钱 6 int findCount(int money, int countOfChange) 7 { 8 int i, j; 9 a[0] = 1; 10 for (i = 1; i <= countOfChange; i++) 11 { 12 for (j = change[i]; j <= money; j++) 13 { 14 //核心的代码,就此一句 15 a[j] = a[j] + a[j - change[i]]; 16 } 17 /* 18 //去掉注释,可打印每一步的情况 19 for (j = 0; j <= money; j++) 20 printf("%d\t", a[j]); 21 puts("");*/ 22 23 } 24 return a[money]; 25 } 26 int main() 27 { 28 int money, num, count, i; 29 money = 6; 30 num = 3; 31 //一系列输入 32 printf("input the money u have: "); 33 scanf("%d", &money); 34 printf("input the kinds of changes: "); 35 scanf("%d", &num); 36 for (i = 1; i <= num; i++) 37 { 38 printf("the %dth change: ", i); 39 scanf("%d", &change[i]); 40 } 41 count = findCount(money, num); 42 printf("the count is %d.\n", count); 43 return 0; 44 }