codeforces 688E - The Values You Can Make 简单dp

题意:一个数组a[i],你可以挑出若干个数(只能挑一次)加起来等于k,

针对每一种方案,你可以选出这若干个数的子集来组合新数

最后所有的方案能组合出多少种数

分析:一看数据范围n,k<=500

那就是显而易见就是母函数那套了

从1到n,dp[i][j],代表通过前i个元素和为i,能否组合出j

#include <cstdio>
#include <iostream>
#include <ctime>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=1e5+5;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
int a[N],n,p;
int dp[505][505],tmp[505];
vector<int>ret;
int main(){
    scanf("%d%d",&n,&p);
    for(int i=1;i<=n;++i){
      scanf("%d",&a[i]);
    }
    sort(a+1,a+1+n);
    dp[0][0]=1;
    for(int i=1;i<=n;++i){
      for(int j=p;j>=a[i];--j){
        for(int k=0;k+a[i]<=p;++k)
        if(dp[j-a[i]][k])dp[j][k]=dp[j][k+a[i]]=1;
      }
    }
    for(int i=0;i<=p;++i)
      if(dp[p][i])ret.push_back(i);
    printf("%d\n",ret.size());
    for(int i=0;i<ret.size()-1;++i)
      printf("%d ",ret[i]);
    printf("%d\n",ret[ret.size()-1]);
    return 0;
}

时间: 2024-09-30 06:54:51

codeforces 688E - The Values You Can Make 简单dp的相关文章

codeforces Gym 100500H A. Potion of Immortality 简单DP

Problem H. ICPC QuestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/attachments Description Noura Boubou is a Syrian volunteer at ACM ACPC (Arab Collegiate Programming Contest) since 2011. She graduated from Tishreen Un

Codeforces Round #260 (Div. 1) A. Boredom (简单dp)

题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. 简单dp,dp[i]表示取i时zui最大和为多少,方程为dp[i] = max(dp[i - 1] , dp[i - 2] + cont[i]*i). 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef __int64 LL;

Codeforces 687C The Values You Can Make(DP)

题目大概说给n个各有价值的硬币,要从它们中选出若干个组合成面值k,而要求的是各个方案里这些选出的硬币能组合出来的面值有哪些. 有点绕.. dp[i][j][k]表示前i个硬币中 能否 组合成面值j且选出的硬币能组合成面值k 转移要考虑全面..三个方向转移,第i个不选.第i个选但不参与选出硬币去组合成k.第i个选且参与选出硬币去组成成k 1 #include<cstdio> 2 using namespace std; 3 4 bool d[555][555][555]; 5 int main(

Codeforces 18D Seller Bob &amp;&amp; 18E Flag 2 简单dp

D题很恶心的要用大数. dp[i] 表示到第 i 条信息的最大收益. 显然,dp[1]  = 0. 对于i > 1有,若当前信息为 win x,那么显然有dp[i] = dp[i-1]. 若当前信息为sell x,那么dp[i] = max(dp[i-1] , dp[j] + 2^x),j 需满足j < i && 第j条信息为 win y && y == x. import java.util.Scanner; import java.math.BigInteg

Codeforces 41D Pawn 简单dp

题目链接:点击打开链接 给定n*m 的矩阵 常数k 下面一个n*m的矩阵,每个位置由 0-9的一个整数表示 问: 从最后一行开始向上走到第一行使得路径上的和 % (k+1) == 0 每个格子只能向或走一步 求:最大的路径和 最后一行的哪个位置作为起点 从下到上的路径 思路: 简单dp #include <cstdio> #include <algorithm> #include<iostream> #include<string.h> #include &

CodeForces 30C Shooting Gallery 简单dp

题目链接:点击打开链接 给定n个气球 下面n行 x y t val 表示气球出现的坐标(x,y) 出现的时刻t,气球的价值val 枪每秒移动1个单位的距离 问: 射击的最大价值,开始时枪瞄准的位置任意. 思路: dp一下.. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <math.h> #include <set

HDU 5375 Gray code (简单dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 626    Accepted Submission(s): 369 Problem Description The reflected binary cod

POJ 3250 Bad Hair Day 简单DP 好题

Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads. Each cow i has a sp

CodeForces 28D Don&#39;t fear, DravDe is kind dp

题目链接:点击打开链接 要使得删除后车队是合法的,即对于车队中的每辆车, l+r+c 都相同,则按l+r+c分类. 然后dp一下. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <math.h> #include <set> #include <vector> #include <map&g