标签:合数 sem using mem size pen 时间 lan lap
硬币划分
输入整数n.(1<=n<=100000)
输出组合数,答案对1e9+7取模。
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 }
标签:合数 sem using mem size pen 时间 lan lap
原文地址:https://www.cnblogs.com/djf666/p/11774423.html