POJ:2229-Sumsets(完全背包的优化)
题目链接:http://poj.org/problem?id=2229
Sumsets
Time Limit: 2000MS Memory Limit: 200000K
Total Submissions: 21845 Accepted: 8454
Description
Farmer John commanded his cows to search for different sets of numbers that sum to a given number. The cows use only numbers that are an integer power of 2. Here are the possible sets of numbers that sum to 7:
1) 1+1+1+1+1+1+1
2) 1+1+1+1+1+2
3) 1+1+1+2+2
4) 1+1+1+4
5) 1+2+2+2
6) 1+2+4
Help FJ count all possible representations for a given integer N (1 <= N <= 1,000,000).
Input
A single line with a single integer, N.
Output
The number of ways to represent N as the indicated sum. Due to the potential huge size of this number, print only last 9 digits (in base 10 representation).
Sample Input
7
Sample Output
6
解题心得:
- 问给你一系列2的N次方的数,让你用这些数相加起来等于m,问一共有多少种方法。
- 刚开始看到这个题的时候第一个反应就是青蛙跳台阶的问题(链接),按照这个思路状态转移就出来了。dp[n][m] += dp[n-1][m-k*c[i]],在空间上优化可以使用滚动数组来进行优化。这样还是会TLE,因为没有优化过的完全背包是三重循环,这个时候就需要用到完全背包的优化,完全背包的优化其实很简单,思想就是既然背包有无穷多个,那么直接从小到大开始叠加就行了,会自然叠加到最大,这样就可以省去k个背包的循环,利用的就是k无穷大不用一一进行枚举。可以很简单的看懂优化代码。
没有优化过的完全背包(大概写法):
for(int i=0;i<n;i++) {
for(int k=1;k*c[i] <= n;k++) {
for(int j=m;j>=k*c[i];k--) {
dp[j] += dp[j-k*c[i]];
}
}
}
完全背包的时间优化(大概写法):
for(int i=0;i<n;i++) {
for(int j=c[i];j<=n;j++) {//注意这里是从小到大开始叠加
dp[j] += dp[j-c[i]];
}
}
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = (int) 1e6 + 10;
int n, dp[maxn];
int Mod = (int) 1e9;
int main() {
int T = 1;
while (~scanf("%d", &n)) {
memset(dp, 0, sizeof(dp));
dp[0] = 1;
while (T <= n) {
for (int j = T; j <= n; j++) {
dp[j] += dp[j - T];
dp[j] %= Mod;
}
T <<= 1;
}
printf("%d\n", dp[n]);
return 0;
}
}
POJ:2229-Sumsets(完全背包的优化)的更多相关文章
- poj 2229 Sumsets 完全背包求方案总数
Sumsets Description Farmer John commanded his cows to search for different sets of numbers that sum ...
- poj 2229 【完全背包dp】【递推dp】
poj 2229 Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 21281 Accepted: 828 ...
- POJ 2229 Sumsets(技巧题, 背包变形)
discuss 看到有人讲完全背包可以过, 假如我自己做的话, 也只能想到完全背包了 思路: 1. 当 n 为奇数时, f[n] = f[n-1], 因为只需在所有的序列前添加一个 1 即可, 所有的 ...
- poj -2229 Sumsets (dp)
http://poj.org/problem?id=2229 题意很简单就是给你一个数n,然后选2的整数幂之和去组成这个数.问你不同方案数之和是多少? n很大,所以输出后9位即可. dp[i] 表示组 ...
- POJ 1014 Dividing(多重背包, 倍增优化)
Q: 倍增优化后, 还是有重复的元素, 怎么办 A: 假定重复的元素比较少, 不用考虑 Description Marsha and Bill own a collection of marbles. ...
- POJ 2229 Sumsets
Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 11892 Accepted: 4782 Descrip ...
- poj 2229 Sumsets(dp)
Sumsets Time Limit : 4000/2000ms (Java/Other) Memory Limit : 400000/200000K (Java/Other) Total Sub ...
- POJ 2229 sumset ( 完全背包 || 规律递推DP )
题意 : 给出一个数 n ,问如果使用 2 的幂的和来组成这个数 n 有多少种不同的方案? 分析 : 完全背包解法 将问题抽象==>有重量分别为 2^0.2^1.2^2…2^k 的物品且每种物 ...
- 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(dp 或 数学)
Description Farmer John commanded his cows to search . Here are the possible sets of numbers that su ...
随机推荐
- 弹性布局 Flexible Box
页面中任何一个元素都可以指定为 弹性布局(Flex) 属性:display 取值: 1.flex 将块级元素变为弹性布局容器 2.inline-flex 将行内元素变为弹性布局容器 兼容性 ...
- DOM 事件冒泡
1.什么是事件冒泡? 事件冒泡就是从具体到不具体, 例如:当你给了一个button按钮一个点击事件,再给他的父级相同的事件,就会按照,button,body,document,window,继续向上冒 ...
- node安装express时找不到pakage.json文件;判断安装成功?
正常安装命令:express install express --save 报错如下:no such file or directory,open 'C:\Users\Administrator\pa ...
- System.IO.IOException: The handle is invalid.
System.IO.IOException: The handle is invalid. 00022846 11:39:49.098 AM [892] 00022847 11:39:49.098 A ...
- 视频会议20方100点 v2.66.1.18
平台: Windows 类型: 虚拟机镜像 软件包: 视频会议服务器( Video Conference Server ) 20-party video conference business int ...
- Oracle三种循环例题:打印九九乘法表
数据库SQL三种循环语句(For.While.Loop) --如果要将执行结果输出,需要先执行 setserveroutput on 命令,在窗口里显示服务器输出信息 set serveroutput ...
- Win10技巧:使用“照片”应用剪辑视频、添加特效
Win10内置了很多实用的应用,你不仅可以通过“Win键+G”快速录制电脑屏幕,如软件操作.游戏界面等,你还可以利用“照片”应用来对视频进行快速的剪辑,把录制前后多余的内容去除,同时你也可以对游戏中的 ...
- 笨办法学Python(七)
习题 7: 更多打印 现在我们将做一批练习,在练习的过程中你需要键入代码,并且让它们运行起来.我不会解释太多,因为这节的内容都是以前熟悉过的.这节练习的目的是巩固你学到的东西.我们几个练习后再见.不要 ...
- 1929. Teddybears are not for Everyone (Timus) (combination+reading questions)
http://acm.timus.ru/problem.aspx?space=1&num=1929 combination problems. 排列组合问题. According to the ...
- Jenkins使用分组过滤分类
背景:Jenkins项目过多,通过选项卡的方式过滤需要的项目 1.点击选择卡上的加号 2.填写要分组的名字 3.可选择某个job进行分类,或者使用正则表达式的方式进行分类,楼主是根据正则进行匹配, 4 ...