zoukankan      html  css  js  c++  java
  • 数分解

    #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;
    }
  • 相关阅读:
    2.17-2.23第一周总结
    10号总结
    9日总结
    8号总结
    7号寒假总结
    6号
    读后感《程序员的修炼之道:从小工到专家》1
    java第二次动手动脑
    回文判断
    二进制的原码,反码以及补码介绍
  • 原文地址:https://www.cnblogs.com/MorrowWind/p/13056475.html
Copyright © 2011-2022 走看看