对于这个问题, 我们显然可以看出来, 当他是奇数的时候, 直接等于他的前一个偶数  

    dp [ i ] = dp [ i - 1] ;

    那么问题, 当它是偶数的时候, 我们应该怎么进行 dp 记忆化搜索并且递归?  

  不知你是否记得化分数问题, 不记得话,请看dp初级内容, 就在DP 内容

  我们这里也是同样采取分成组内部有 1, 和分成组的内部没有 1

    当有一的时候, 那么就和上面的奇数一样, 具体说一下为什么, 以为它是偶数,一旦他有一, 那么至少为 2 个, 我们把这两个 1 进行合并, 然后看成  i - 1 中剩下的 一个 1 ,完成了递归

    当没有一的时候, 我们可以直接 除以二进行处理, 以为最小化单元就可以看做之前的最小化单元 1 ,

  所以说  dp [ i ]  =  dp [ i - 1] + dp [ i / 2 ] ;

    下面是代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <list>
#include <map>
#include <stack>
#include <set>
using namespace std;
const int MAX_N = ;
const int MOD = ;
int dp[MAX_N];
// TM 递归会栈溢出, 这也太狗了吧!!
int rec(int n){
if(dp[n] != -) return dp[n];
else{
if(n & ) //奇数
dp[n] = rec(n - );
else{
dp[n] = (rec(n - ) + rec(n >> )) % MOD;
}
}
return dp[n];
} int main()
{
int n;
memset(dp, , sizeof(dp)); dp[] = ; dp[] = dp[] = ;
cin>>n;
for(int i = ; i <= n; i++){
dp[i] = dp[i - ];
if(!(i & )){
dp[i] += dp[i>>];
}
dp[i] %= MOD;
}
printf("%d\n", dp[n]);
return ;
}

除了这一种写法还会有另外一种的写法:

这个方法类似于背包

然后就是原来的基础上进行加上了新的  2  的倍数!

#include<iostream>
#include<cstdio>
using namespace std;
const int mod = 1e9;
const int maxn = ; int main(){
int c[] = {};
long long int dp[maxn] = {};
for(int i = ; i < ; i++)
c[i] = c[i-] * ;
dp[] = ;
int n;
cin >> n;
for(int i = ; i < ; i++){
for(int j = c[i];j < n+; j++){
//当他循环的时候, 相当于 在最大 为 c[i] 因子的限制条件下, 他的种类数目
dp[j] = dp[j] + dp[j-c[i]];
// 这个递归关系是相当于有了一个甚至多个 c[i] 的时候, 进行递归, 然后加上之前没有的
if(dp[j] > mod) dp[j] = dp[j] % mod;
}
}
printf("%lld\n", dp[n]);
return ;
}

但是图片中有点小错误, 不知道你发现了没有, 应该是: dp [ i ] [ j ]  = dp [ i - 1 ] [ j ]   + dp [ i  ] [  j - w [ i ] ]   !!!

所以说, 上代码 :

#include <iostream>
#include <cstdio>
#include <algorithm>
#define Maxn 1000005
using namespace std;
int n;
int w[Maxn];
int cnt=;
int dp[Maxn];
int main()
{
scanf("%d",&n);
for(int i=;(<<i)<=n;i++)//构造所有物品
w[cnt++]=(<<i);
dp[]=;
for(int i=;i<cnt;i++)
for(int j=w[i];j<=n;j++)
dp[j]=(dp[j]+dp[j-w[i]])%;//取余 printf("%d\n",dp[n]);
return ;
}

高深的dp POJ 2229Sumsets的更多相关文章

  1. 状压DP POJ 3254 Corn Fields

    题目传送门 /* 状态压缩DP:先处理硬性条件即不能种植的,然后处理左右不相邻的, 接着就是相邻两行查询所有可行的种数并累加 写错一个地方差错N久:) 详细解释:http://www.tuicool. ...

  2. 状压DP POJ 2411 Mondriaan'sDream

    题目传送门 /* 题意:一个h*w的矩阵(1<=h,w<=11),只能放1*2的模块,问完全覆盖的不同放发有多少种? 状态压缩DP第一道:dp[i][j] 代表第i行的j状态下的种数(状态 ...

  3. dp poj 1080 Human Gene Functions

    题目链接: http://poj.org/problem?id=1080 题目大意: 给两个由A.C.T.G四个字符组成的字符串,可以在两串中加入-,使得两串长度相等. 每两个字符匹配时都有个值,求怎 ...

  4. 图论+dp poj 1112 Team Them Up!

    题目链接: http://poj.org/problem?id=1112 题目大意: 有编号为1~n的n个人,给出每个人认识的人的编号,注意A认识B,B不一定认识A,让你将所有的人分成两组,要求每组的 ...

  5. Treats for the Cows 区间DP POJ 3186

    题目来源:http://poj.org/problem?id=3186 (http://www.fjutacm.com/Problem.jsp?pid=1389) /** 题目意思: 约翰经常给产奶量 ...

  6. DFS(DP)---POJ 1014(Dividing)

    原题目:http://poj.org/problem?id=1014 题目大意: 有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两 ...

  7. 区间DP POJ 1141 Brackets Sequence

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29520   Accepted: 840 ...

  8. 矩阵快速幂+概率DP poj 3744

    题意:在一条不满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,100000000]. 每次前进p的概率前进一步,1-p的概率前进1-p步.问 ...

  9. 区间DP poj 2955

    求最多有几个括号可以匹配 #include<stdio.h> #include<string.h> #include<algorithm> using namesp ...

随机推荐

  1. tarjan缩点——在农场万圣节Trick or Treat on the Farm

    一个房间能到另一个房间,有向图,奶牛从自己编号(1到n)的点出发,如果回到以前到过的点就停止,问每头奶牛可以经过几个点: 情况分两种, 一,奶牛在环上,能走的是环的大小,二,一条链连接一个环,大小是链 ...

  2. Python学习日记(九)—— 模块二(logging、json&pickle、xml、requests、configparser、shutil、subprocess)

    logging模块 用于便捷记录日志且线程安全的模块(便捷的写文件的模块,不允许多个人同时操作文件) 1.单文件日志 import logging logging.basicConfig(filena ...

  3. 访问redis集群提示连接超时的问题

    上周在服务器通过docker部署了一个单机版redis集群,今天通过StackExchange.Redis访问的时候报了这个错: 提示我把超时时间设置一下,我去服务器上找到redis的配置文件,发现不 ...

  4. Linux下的crontab定时执行任务简要说明

    在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为“cr ...

  5. --thunder-lock is available since uWSGI 1.4.6 but never got documentation (of any kind)

    --thunder-lock is available since uWSGI 1.4.6 but never got documentation (of any kind) Serializing ...

  6. mac安装mysql数据库及配置环境变量

    mac安装mysql数据库及配置环境变量 mac安装mysql数据库及配置环境变量 原文文链接:https://blog.csdn.net/qq_36004521/article/details/80 ...

  7. Coarse-to-Fine超分辨率相关

    1.A Coarse-to-Fine Subpixel Registration Method to Recover Local Perspective Deformation in the Appl ...

  8. Android:动态库(.so)调试技巧

    一.反汇编定位crash ①查看crash log: 上图已标出crash发生在 libdeflicker_gpu.so 库中的 default_fail_func() 函数,但是 libdeflic ...

  9. sysbench 压测

    IP架构 sysbench部署服务器:172.17.100.107 压测服务器:172.17.100.100 MySQL部署目录:/usr/local/mysql 前置工作 1.完成MySQL的安装( ...

  10. [maven]maven插件 tomcat7-maven-plugin 的使用

    使用 tomcat7-maven-plugin,可以将tomcat内嵌到web项目中,直接运行webapp项目. 第一步.pom.xml的配置: <build> <plugins&g ...