码迷,mamicode.com
首页 > 其他好文 > 详细

硬币划分

时间:2019-10-31 23:44:04      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:合数   sem   using   mem   size   pen   时间   lan   lap   

硬币划分

有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

 

硬币划分

标签:合数   sem   using   mem   size   pen   时间   lan   lap   

原文地址:https://www.cnblogs.com/djf666/p/11774423.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!