您的位置:首页 > 其它

51Nod-1101 换零钱【0/1背包+DP】

2018-02-09 10:25 357 查看
1101 换零钱 

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题

 
N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元。例如:5分钱换为零钱,有以下4种换法:1、5个1分2、1个2分3个1分3、2个2分1个1分4、1个5分(由于结果可能会很大,输出Mod 10^9 + 7的结果)Input
输入1个数N,N = 100表示1元钱。(1 <= N <= 100000)
Output
输出Mod 10^9 + 7的结果
Input示例
5
Output示例
4
问题链接51Nod-1101 换零钱

问题分析:这是一个递推组合的问题,关键是找出递推函数来。许多组合问题都有递推式,可以用DP来实现。
程序说明:需要注意模除。
题记:(略)

参考链接:(略)

AC的C++程序如下:#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

const int coins[] = {1,2,5,10,20,50,100,200,500,1000,2000,5000,10000};
const int coinslen = sizeof(coins) / sizeof(coins[0]);

const int MOD = 1e9 + 7;

const int N = 1e5;
long long dp[N + 1];

void setcoin(int n)
{
int k;

memset(dp, 0, sizeof(dp));

dp[0] = 1;
for(int i=0; i<coinslen; i++) {
k = coins[i];
for(int j=k; j<=n; j++) {
dp[j] += dp[j - k];
dp[j] %= MOD;
}
}
}

int main()
{
int n;

scanf("%d", &n);

setcoin(n);

printf("%lld\n", dp
);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: