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

繁繁的数字 背包DP

时间:2019-11-02 13:52:42      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:ber   mod   ace   log   printf   names   turn   分解   stdin   

繁繁的数字 背包DP

问一个数\(n\)有多少种二进制分解方案数

\(n\le 10^5\)

如7有7=4+2+1=4+1+1+1=2+2+2+1=2+2+1+1+1=2+1+1+1+1+1=1+1+1+1+1+1+1,共6种方案

一眼完全背包,将\(2^0,2^1\cdots\)等看成\(log_n\)个物品,每个物品无限件,背包体积为\(n\)。然后求方案数套个计数DP即可。

其他机房大佬都是找规律找出来的……

#include <cstdio>
#define MAXN 1000010
#define MOD 1000000007
#define ll long long
using namespace std;
int n;
ll f[MAXN];
int main()
{
    //freopen("number.in","r",stdin);
    //freopen("number.out","w",stdout);
    scanf("%d", &n);
    f[0]=1;
    int tmp=0;
    for(int i=0;tmp=(1<<i),tmp<=n;++i){
        for(int j=0;j<=n;++j)
            if(j>=tmp)
                f[j]=(f[j]+f[j-tmp])%MOD;
    }
    printf("%lld", f[n]);
    return 0;
}

繁繁的数字 背包DP

标签:ber   mod   ace   log   printf   names   turn   分解   stdin   

原文地址:https://www.cnblogs.com/santiego/p/11781394.html

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