DP:Sumsets(POJ 2229)

题目大意:给定你一个整数m,你只能用2的k次幂来组合这个数,问你有多少种组合方式?
这一题一看,天啦太简单了,完全背包?是不是?
不过的确这一题可以用完全背包来想,但是交题绝对是TLE,如果真的是完全背包的做法那我就不用等那么多天再发这个坑,这一题的确要用到点奇妙的思想。
首先,我们忽略了这一题的最重要的一个条件,我们使用的数就是2次幂的,那么2次幂的数可以做什么呢?这就是一个数学问题了
不过不要怕,这个数学问题也很好想,
首先:任何一个奇数一定有1来组成,推论:任何偶数都可以只由除了1的数组成
其次,任何一个偶数都可以由一个数左移1来得到(参考二进制)
下面我们就用这两个数学结论来思考怎么简化递推。
回到问题上来,完全背包会TLE的原因是出在在第二个循环的时候对j进行了过多的枚举,那么我们在用这两个结论的时候必须避开这一点,最好一步到位,所以我们必须把个数全部压在前一次的情况上,那么我们可首先用结论1,对于任何一个奇数,我们都可以用上一个偶数+1(组合数不变,因为只能加这个1),且这个集合不能由其他集合直接得到,那么我们就得到第一个递推公式
dp[j]=dp[j-1] 当j=奇数
现在用到第二个结论,因为我们的偶数可以从奇数得到,也可以从偶数得到,那么可以第一部分可以从dp[j-1]得到,另外一个部分就要思考结论2,因为我们只是左移,组合数是不变的,所以我们还可以从dp[j>>1]中得到另一部分的组合数,这样就避开了一个一个查找枚举i的背包了
所以综上,状态转移方程为:
dp[i]=dp[i-1] 当i是奇数
dp[i]=dp[i-1]+dp[i>>1] 当i是偶数
(注意这一题只显示9个数字)
#include <stdio.h>
#include <stdlib.h>
#define M 1000000000 long long Combinatories[]; int main(void)//这一题不能用完全背包,会超时
{
int N, i;
Combinatories[] = ;//这个地方要设置成1 for (i = ; i < ; i++)
{
if (i % == )
Combinatories[i] = Combinatories[i - ];
else
Combinatories[i] = Combinatories[i - ] + Combinatories[i >> ];
Combinatories[i] %= M;
} while (~scanf("%d", &N))
printf("%d\n", Combinatories[N] % M); return ;
}
DP:Sumsets(POJ 2229)的更多相关文章
- poj 2229 【完全背包dp】【递推dp】
poj 2229 Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 21281 Accepted: 828 ...
- poj -2229 Sumsets (dp)
http://poj.org/problem?id=2229 题意很简单就是给你一个数n,然后选2的整数幂之和去组成这个数.问你不同方案数之和是多少? n很大,所以输出后9位即可. dp[i] 表示组 ...
- Sumsets(POJ 2229 DP)
Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 15293 Accepted: 6073 Descrip ...
- poj 2229 Sumsets(dp)
Sumsets Time Limit : 4000/2000ms (Java/Other) Memory Limit : 400000/200000K (Java/Other) Total Sub ...
- poj 2229 Sumsets(dp 或 数学)
Description Farmer John commanded his cows to search . Here are the possible sets of numbers that su ...
- poj 2229 Sumsets(记录结果再利用的DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 将一个数N分解为2的幂之和共有几种分法? 题解: 定义dp[ i ]为数 i 的 ...
- POJ 2229 Sumsets【DP】
题意:把n拆分为2的幂相加的形式,问有多少种拆分方法. 分析:dp,任何dp一定要注意各个状态来源不能有重复情况.根据奇偶分两种情况,如果n是奇数则与n-1的情况相同.如果n是偶数则还可以分为两种情况 ...
- poj 2229 Sumsets DP
题意:给定一个整数N (1<= N <= 1000000),求出以 N为和 的式子有多少个,式子中的加数只能有2的幂次方组成 如5 : 1+1+1+1+1.1+1+1+2.1+2+2.1+ ...
- POJ 2229 Sumsets
Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 11892 Accepted: 4782 Descrip ...
随机推荐
- str内部方法
代码 #str内部功能 name=' aK am\til.L iu' age=18 num=-11 ab='#' ac=('1','2','3','4','5','6','7') print(dir( ...
- 【poj3020】 Antenna Placement
http://poj.org/problem?id=3020 (题目链接) 题意 给出一个矩阵,矩阵中只有‘*’和‘o’两种字符,每个‘*’可以向它上下左右四个方位上同为‘*’的点连一条边,求最少需要 ...
- 求DAG上两点的最短距离
Problem 给出一个不带边权(即边权为1)的有向无环图(unweighted DAG)以及DAG上两点s, t,求s到t的最短距离,如果无法从s走到t,则输出-1. Solution DFS,BF ...
- Linux cscope命令
一.简介 Cscope 是一款开源免费的 C/C++浏览工具,自带一个基于文本的用户界面,通过cscope可以很方便地找到某个函数或变量的定义位置.被调用的位置等信息.Cscope对 C /C++支持 ...
- MyEclipse修改项目名称后,部署到 tomcat问题
问题描述: 修改项目名称后,部署到tomcat问题 解决方案: 项目->属性->myelcipse->web下,修 改web context root就可! 要在eclipse里面改 ...
- MyEclipse------快速读取特定目录下的文件的内容(字节输入流)
other.jsp <%@ page language="java" import="java.util.*" pageEncoding="UT ...
- Virtualbox虚拟机安装Ubuntu图文版
这篇文章给大家介绍一下如何在Windows系统下的Virtual Box虚拟机软件中安装Ubuntu系统. 适用环境:Windows系统作为物理机,在此平台上搭建一个Virtual Box虚拟平台,在 ...
- --hdu 1114 Piggy-Bank(完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 AC code: #include<bits/stdc++.h> using nam ...
- Database Password Hashes
SQL Server 2000:- SELECT password from master.dbo.sysxlogins where name=’sa’ 0×010034767D5C0CFA5FDCA ...
- angular-ngSanitize模块-linky过滤器详解
本篇主要讲解angular中的linky这个过滤器.此过滤器依赖于ngSanitize模块. linky能找出文本中的链接,然后把它转换成html链接.什么意思,就是说,一段文本里有一个链接,但是这个 ...