#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;
}
#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;
}