硬币划分
Posted djf666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了硬币划分相关的知识,希望对你有一定的参考价值。
硬币划分
- 热度指数:1598 时间限制:1秒 空间限制:65536K
- 算法知识视频讲解
有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 }
以上是关于硬币划分的主要内容,如果未能解决你的问题,请参考以下文章
算法题LeetCode-硬币划分问题-(动态规划斜率优化空间压缩)
算法题LeetCode-硬币划分问题-(动态规划斜率优化空间压缩)
算法题LeetCode-硬币划分问题-(动态规划斜率优化空间压缩)
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试