题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1677

题意:

  给定n(n <= 10^6),将n分解为2的幂次方之和,问你有多少种方法。

题解:

  两种方法。

  一、无限背包

    将1,2,4,8...看作物品体积就好。

    复杂度O(n*k),k约为20。

  二、递推

    对于dp[i],有两种情况。

      (1)i为奇数。则分解结果中一定有1。

          所以dp[i] = dp[i-1]。

      (2)i为偶数。再分两种情况:

          a. 分解结果中有1,所以dp[i] += dp[i-1]

          b. 分解结果中没有1,即所有加数都是2的倍数。可以将所有加数都除以2,所以dp[i] += dp[i/2]

          综上:dp[i] = dp[i-1] + dp[i/2]

AC Code(背包):

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1000005
#define MOD 1000000000 using namespace std; int n;
int dp[MAX_N]; int main()
{
cin>>n;
memset(dp,,sizeof(dp));
dp[]=;
for(int i=;i<=;i++)
{
for(int j=(<<i);j<=n;j++)
{
dp[j]=(dp[j]+dp[j-(<<i)])%MOD;
}
}
cout<<dp[n]<<endl;
}

AC Code(递推):

 // if is odd dp[i] = dp[i-1]
// if is even dp[i] = dp[i-1] + dp[i/2]
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1000005
#define MOD 1000000000 using namespace std; int n;
int dp[MAX_N]; int main()
{
cin>>n;
memset(dp,,sizeof(dp));
dp[]=;
for(int i=;i<=n;i++)
{
if(i&) dp[i]=dp[i-];
else dp[i]=(dp[i-]+dp[i>>])%MOD;
}
cout<<dp[n]<<endl;
}

BZOJ 1677 [Usaco2005 Jan]Sumsets 求和:dp 无限背包 / 递推【2的幂次方之和】的更多相关文章

  1. BZOJ 1677: [Usaco2005 Jan]Sumsets 求和( dp )

    完全背包.. --------------------------------------------------------------------------------------- #incl ...

  2. BZOJ 1677: [Usaco2005 Jan]Sumsets 求和

    题目 1677: [Usaco2005 Jan]Sumsets 求和 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 617  Solved: 344[Su ...

  3. bzoj 1677: [Usaco2005 Jan]Sumsets 求和【dp】

    设f[i]为i的方案数,f[1]=1,考虑转移,如果是奇数,那么就是f[i]=f[i-1]因为这1一定要加:否则f[i]=f[i-1]+f[i>>1],就是上一位+1或者i/2位所有因子乘 ...

  4. 1677: [Usaco2005 Jan]Sumsets 求和

    1677: [Usaco2005 Jan]Sumsets 求和 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 626  Solved: 348[Submi ...

  5. 【BZOJ】1677: [Usaco2005 Jan]Sumsets 求和(dp/规律)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1677 完全背包很容易想到,将1,2,4...等作为物品容量即可. 然后这题还有一个递推式 f[i]= ...

  6. BZOJ1677: [Usaco2005 Jan]Sumsets 求和

    1677: [Usaco2005 Jan]Sumsets 求和 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 570  Solved: 310[Submi ...

  7. 【BZOJ1677】[Usaco2005 Jan]Sumsets 求和 递推

    ... #include <iostream> using namespace std; ]; int n,i; int main() { cin>>n; f[]=; ;i&l ...

  8. [Usaco2005 Jan]Sumsets 求和

    Description Farmer John commanded his cows to search for different sets of numbers that sum to a giv ...

  9. HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)

    HYSBZ(BZOJ) 4300 绝世好题(位运算,递推) Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<= ...

随机推荐

  1. 跨域问题解决方式(HttpClient安全跨域 &amp; jsonp跨域)

    1 错误场景 今天要把项目部署到外网的时候,出现了这种问题, 我把两个项目放到自己本机的tomcat下, 进行代码调试, 执行 都没有问题的, 一旦把我须要调用接口的项目B放到其它的server上, ...

  2. http Keep-Alive

    1.什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTT ...

  3. vue2 疑难问题 解析

    1.[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent ...

  4. Java Transaction Management

    Just a few weeks ago, I had a discussion with one of my colleagues about how to manage the transacti ...

  5. Java 实现对Sql语句解析

    原文地址:http://www.cnblogs.com/zcftech/archive/2013/06/10/3131286.html 最近要实现一个简易的数据库系统,除了要考虑如何高效的存储和访问数 ...

  6. ubuntu16.04下Cmake学习一

    根据网上的资料,我总结了一下,一个工程应该有根目录(bin)存放可执行文件,头文件目录(include)存放头文件,源码文件(src)存放你的算法,还需要一个库文件夹存放你编译的静态库或者动态库.然后 ...

  7. ie6中利用jquery居中

    1.利用jquery居中代码 <script type="text/javascript"> $hwidth=parseInt($(window).width()); ...

  8. 推荐TED演讲:20岁光阴不再来(Why 30 is not the new 20)

    缘起 早上起来在电脑上看到"自强不息"群(群号)中骆宏给大家分享的视频."20岁光阴不再来",利用短暂的时间浏览了一下.就像把这个TED视频分享给很多其它的朋友 ...

  9. Office 365 开发入门

    <Office 365 开发入门指南>公开邀请试读,欢迎反馈 终于等来了这一天,可以为我的这本新书画上一个句号.我记得是在今年的2月份从西雅图回来之后,就萌发了要为中国的Office 36 ...

  10. HDU1864 最大报销额 01背包

    非常裸的01背包,水题.注意控制精度 #include <iostream> #include <algorithm> #include <cstdio> #inc ...