数分解

#include<bits/stdc++.h>
using namespace std;
//背包问题求限制条件的方案数,求装满的前提下的方案数(不是最优解也可)
//这个题等价于求完全背包的方案数,dp数组表示装满的方案数目,只包括装满了的,这取决于初始值,
//如果dp数组表示总方案数,包括没装满的,那么初始值不同
//数组太大使用滚动数组+完全背包的优化
//dp[i][j]=dp[i][j-w]+dp[i-1][j]
int n,m,dp[1000000+10],p=1000000000,a[20];
int main() {
    while(cin >> n){
        //10^6最多分解到2^19,则计算背包物品
        for(int i=0;i<20;i++){
            a[i]=(1<<i);
        }
        memset(dp,0, sizeof(dp));
        for(int i=0;i<=n;i++) dp[i]=1;//这里0也有1种情况,因为2 4 8等会用到dp[0]
        for(int i=1;i<20;i++){
            for(int j=0;j<=n;j++){
                if(j>=a[i])
                    dp[j]=(dp[j]+dp[j-a[i]])%p;
            }
        }
        cout<<dp[n]<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/MorrowWind/p/13056475.html