1. 程式人生 > >C語言,有N個硬幣面值為a[1]...a[N],給一個非負數m,用這些硬幣湊成m,求有多少種方法?

C語言,有N個硬幣面值為a[1]...a[N],給一個非負數m,用這些硬幣湊成m,求有多少種方法?

#include <stdio.h>
#include <memory.h>
#define N 1000
#define M 100000


int a[N];
int DP[M];


int dpItUnlimited(int m, int n, int coin[]) {
memset(DP, 0, sizeof(DP));
int i, j;
for(i = 0, DP[0] = 1; i < n; i ++) {
for(j = 0; j + coin[i] <= m; j ++) {
DP[j + coin[i]] += DP[j];
}
}
return DP[m];
}


int dpIt(int m, int n, int coin[]) {
memset(DP, 0, sizeof(DP));
int i, j;
for(i = 0, DP[0] = 1; i < n; i ++) {
for(j = m; j >= coin[i]; j --) {
DP[j] += DP[j - coin[i]];
}
}
return DP[m];
}


int main(){
int m, n;
printf("輸入m:");
scanf("%d", &m);
printf("輸入N:");
scanf("%d", &n);
printf("輸入陣列a(長度為%d,用空格隔開):\n", n);
for(int i = 0; i < n; i ++) {
scanf("%d", &a[i]);
}
printf("如果%d種面值均有無限個,湊成%d的方法有%d種\n", n, m, dpItUnlimited(m, n, a));
printf("如果%d種面值均只有一個,湊成%d的方法有%d種\n", n, m, dpIt(m, n, a));
return 0;
}