硬币划分

硬币划分

有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n <= 100000),有多少中组合可以组成n分钱?

输入描述:
输入整数n.(1<=n<=100000)


输出描述:
输出组合数,答案对1e9+7取模。
示例1

输入

13

输出

16

通俗的讲下: 举个例子:{1,2,5,10},当1 2 遍历完后 那么开始遍历5时整个dp数组已经完成了对仅对1 2进行分配的种类,但并没有开始以5开始,比如7,当遍历完1 2之后
dp[7]存储的就是以 1 2 分进行分配的种类,开始进行以5分配时 开始以5为跨度(7-5=2)找到dp[2](此时2这个位置已经完成了1 2分配)那么7这个位置只需要再添加上dp[2]+1
(这个1的意思就是2的分配种类数再加上2 5(2+5=7)这个分类)即是7的种类数同理可以想象下12等等后面的数就不难了。
附个证明链接:
https://www.cnblogs.com/wuxie0ne/p/11603807.html
 1 #include<bits/stdc++.h>
 2 #include<algorithm>
 3 using namespace std;
 4 const long long mod=1e9+7;
 5 int main()
 6 {
 7     long long n;
 8     scanf("%lld",&n);
 9     long long num[4]={1,2,5,10};
10     long long dp[100010];
11     memset(dp,0,sizeof(dp));
12     dp[0]=1;
13     for(int j=0;j<4;j++){
14         for(int i=num[j];i<=n;i++){
15             dp[i]=(dp[i]+dp[i-num[j]])%mod;
16         }
17     }
18     printf("%lld", dp[n]);
19     return 0;
20 }
answer

猜你喜欢

转载自www.cnblogs.com/djf666/p/11774423.html