题目描述
一个整数总可以拆分为2的幂的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1 总共有六种不同的拆分方式。 再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。 用f(n)表示n的不同拆分的种数,例如f(7)=6. 要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。
输入描述:
每组输入包括一个整数:N(1<=N<=1000000)。
输出描述:
对于每组数据,输出f(n)%1000000000。
示例1
输入:
7
输出:
6
解题思路
本题是背包问题的变形,碰巧刚刚练过背包问题,该问题相当于:有20个物品,每种物品的花销分别为2^0,2^1,2^2,2^3……2^19,现在有一个背包,容量为N(输入的整数),问把背包装满的方式有多少种,本来想自己写一个文章来解析该类问题,后来发现我怎么写也不如在CSDN上看到的一篇文章清晰,这里附上链接吧,侵权删,01背包”及“完全背包”装满背包的方案总数分析及实现,将问题改编后直接按套路解题就好,就是完全背包的装满问题,这里贴出代码。
#include<iostream>
#include<cmath>
using namespace std;
const int MAXLENGTH=10000001;
int F[MAXLENGTH];
int main(){
int V;
int Ci[21];
F[0]=1;
for(int i=1;i<=20;i++){
Ci[i]=(int)pow(2,i-1);
}
while(cin>>V){
for(int i=1;i<=20;i++){
for(int j=Ci[i];j<=V;j++){
F[j]=(F[j]+F[j-Ci[i]])%1000000000;
}
}
cout<<F[V]<<endl;
}
return 0;
}