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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值