Codeforces Round #360 (Div. 2) E. The Values You Can Make 01背包
题目链接:
题目
E. The Values You Can Make
time limit per test:2 seconds
memory limit per test:256 megabytes
问题描述
Pari wants to buy an expensive chocolate from Arya. She has n coins, the value of the i-th coin is ci. The price of the chocolate is k, so Pari will take a subset of her coins with sum equal to k and give it to Arya.
Looking at her coins, a question came to her mind: after giving the coins to Arya, what values does Arya can make with them? She is jealous and she doesn't want Arya to make a lot of values. So she wants to know all the values x, such that Arya will be able to make x using some subset of coins with the sum k.
Formally, Pari wants to know the values x such that there exists a subset of coins with the sum k such that some subset of this subset has the sum x, i.e. there is exists some way to pay for the chocolate, such that Arya will be able to make the sum x using these coins.
输入
The first line contains two integers n and k (1 ≤ n, k ≤ 500) — the number of coins and the price of the chocolate, respectively.
Next line will contain n integers c1, c2, ..., cn (1 ≤ ci ≤ 500) — the values of Pari's coins.
It's guaranteed that one can make value k using these coins.
输出
First line of the output must contain a single integer q— the number of suitable values x. Then print q integers in ascending order — the values that Arya can make for some subset of coins of Pari that pays for the chocolate.
样例
input
6 18
5 6 1 10 12 2
output
16
0 1 2 3 5 6 7 8 10 11 12 13 15 16 17 18
题意
求原序列中子序和为k的子序列的子序列能构成的所有不同的子序和。
题解
由于数据<=500,所以可以n^3 dp。
设dp[i][j][k]表示前面i个数能构成的子序和为j的子序列能构造出自序和为k的数子序列。
然后类似01背包考虑选或不选的情况。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 1010;
int n, m;
bool dp[2][maxn][maxn];
int arr[maxn], vis[maxn];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
}
memset(dp, 0, sizeof(dp));
dp[0][0][0] = 1;
int cur = 0;
for (int i = 1; i <= n; i++) {
cur ^= 1;
memset(dp[cur], 0, sizeof(dp[cur]));
for (int j = 0; j <= m; j++) {
for (int k = 0; k <= m; k++) {
if (dp[cur^1][j][k]) {
dp[cur][j][k] = 1;
dp[cur][j + arr[i]][arr[i]] = 1;
dp[cur][j + arr[i]][k] = 1;
dp[cur][j + arr[i]][k + arr[i]] = 1;
}
}
}
}
vector<int> ans;
for (int k = 0; k <= m; k++) {
if (dp[cur][m][k]) ans.push_back(k);
}
printf("%d\n", ans.size());
for (int i = 0; i < ans.size() - 1; i++) printf("%d ", ans[i]);
printf("%d\n",ans[ans.size()-1]);
return 0;
}
总结
在数据范围允许情况下,考虑越高维的dp往往更能简化问题。
Codeforces Round #360 (Div. 2) E. The Values You Can Make 01背包的更多相关文章
- Codeforces Round #360 (Div. 2) E. The Values You Can Make DP
E. The Values You Can Make Pari wants to buy an expensive chocolate from Arya. She has n coins, ...
- Codeforces Round #360 (Div. 2) D. Remainders Game 数学
D. Remainders Game 题目连接: http://www.codeforces.com/contest/688/problem/D Description Today Pari and ...
- Codeforces Round #360 (Div. 2) D. Remainders Game 中国剩余定理
题目链接: 题目 D. Remainders Game time limit per test 1 second memory limit per test 256 megabytes 问题描述 To ...
- Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 暴力并查集
D. Dividing Kingdom II 题目连接: http://www.codeforces.com/contest/687/problem/D Description Long time a ...
- Codeforces Round #360 (Div. 2) C. NP-Hard Problem 水题
C. NP-Hard Problem 题目连接: http://www.codeforces.com/contest/688/problem/C Description Recently, Pari ...
- Codeforces Round #360 (Div. 2) B. Lovely Palindromes 水题
B. Lovely Palindromes 题目连接: http://www.codeforces.com/contest/688/problem/B Description Pari has a f ...
- Codeforces Round #360 (Div. 2) A. Opponents 水题
A. Opponents 题目连接: http://www.codeforces.com/contest/688/problem/A Description Arya has n opponents ...
- Codeforces Round #360 (Div. 2) D. Remainders Game
D. Remainders Game time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Codeforces Round #360 (Div. 1)A (二分图&dfs染色)
题目链接:http://codeforces.com/problemset/problem/687/A 题意:给出一个n个点m条边的图,分别将每条边连接的两个点放到两个集合中,输出两个集合中的点,若不 ...
随机推荐
- au3 命令
Case $Button1 _RunDOS(@SystemDir &"\sysdm.cpl");打开系统属性 ...
- JS闭包理解_摘
原文地址1:http://www.cnblogs.com/mzwr1982/archive/2012/05/20/2509295.html 闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实 ...
- centOS6.5x64简单的安装openfire
yum install java libldb.i686 mysql-server mysql-connector-java 创建数据库 create database openfire defaul ...
- MVC 开启gzip压缩
using System.IO; using System.IO.Compression; using System.Web; using System.Web.Mvc; public class C ...
- dreamweaver基础1
文本enter回车 (隔着一行)SHIFT+enter回车 (换行不分段)网页图片格式:最优化:在保证画质前提下尽可能是图片数据量小一些.(gif,数据量小,带有动画信息,实现透明背景,但只支持256 ...
- 炫酷实用的jQuery插件 涵盖菜单、按钮、图片
新的一周开始了,今天我们要为大家分享一些全新的jQuery插件和HTML5/CSS3应用,这些jQuery插件不仅非常炫酷,而且还挺实用,这次的分享包含jQuery菜单.CSS3按钮已经多种图片特效, ...
- path 环境变量
path(环境变量)是dos以前的内部命令,windows继续沿用至今.用作运行某个命令的时候,本地查找不到某个命令或文件,会到这个声明的目录中去查找.一般设定java的时候为了在任何目录下都可以运行 ...
- 如何设置fedora默认从命令行启动?
Sumary:因为在fedora中没有/etc/initab文件我们不方便从这里设置它的runlevel target,但是linux又给我们提供了一个强悍的工具systemd,我们可以用system ...
- Eclipse 运行多个Tomcat实例
- windows下apache配置https
1.下载带有openSSL的apache安装包,我下载的为apache_2.2.11-win32-x86-openssl-0.9.8i.msi,安装后确认一下bin路径下的openssl.exe,ss ...