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 ...
随机推荐
- flexbox预习
创建一个flexbox: .flex-container{ display:flex; } flex-direction: column;//将flex排成一列 flex-direction: co ...
- SpringBoot常用应用程序属性
参考地址: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.h ...
- Java问题定位之如何借助线程堆栈进行问题分析
在大型的应用中,线程堆栈打印出来特别多,如何从众多的信息中找到真正有用,有价值的信息,我们需要一定的技巧.本文对此详细介绍. 我们可以从三个方面分析:堆栈的局部信息,一次堆栈的统计信息,多个堆栈的对比 ...
- 关于 no device found for connection ‘ System eth0′问题
在Vmware上面安装CentOS,开机后,使用:service network restart时,会提示一下错误: Shutting down loopback interface: ...
- IOS 多线程-pthread
#import <pthread.h> @interface HMViewController () - (IBAction)btnClick; @end @implementation ...
- C. Tanya and Toys_模拟
C. Tanya and Toys time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- 快算24点,POJ(3983)
题目链接:http://poj.org/problem?id=3983 中文题,就不解释题意了. 类似之前的一篇博客,这里也不上解释了,直接上代码吧. #include <iostream> ...
- 【转】DataURL在Web浏览器中的兼容性总结
IE8+,Firefox,Chrome,Opera,Safari 等现代浏览器普遍支持data URL IE8 data URL 最大长度限制为32k字节,超出无效.IE9+没有这个限制 IE只识别b ...
- 2018.8.5 Bootstrap 使用
Bootstrap的环境搭建 <link rel="stylesheet" type="text/css" href="css/bootstra ...
- ipython notebook超级好用
这个东西超级好用,以后要以c++和python为主要沟通语言了.