codeforces 687C - The Values You Can Make 简单dp
2016-06-30 12:19
363 查看
题意:一个数组a[i],你可以挑出若干个数(只能挑一次)加起来等于k,
针对每一种方案,你可以选出这若干个数的子集来组合新数
最后所有的方案能组合出多少种数
分析:一看数据范围n,k<=500
那就是显而易见就是母函数那套了
从1到n,dp[i][j],代表通过前i个元素和为i,能否组合出j
View Code
针对每一种方案,你可以选出这若干个数的子集来组合新数
最后所有的方案能组合出多少种数
分析:一看数据范围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,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; }
View Code
相关文章推荐
- 关于Hibernate中创建ServiceRegistry对象时找不到ServiceRegistryBuilder对象的问题
- Android之IPC通信中的UID和PID识别
- NSValue的详解
- SQL中一种类似GUID值的函数实现
- IOS开发-UIView之动画效果的实现方法(合集)
- LeetCode Count Numbers with Unique Digits(计数问题)
- 动态计算UITableViewCell高度详解
- iOS UITableView(一)-纯代码创建UITableView,Cell点击事件,Cell左滑删除
- minigui 多级窗口例子
- java中continue到指定的for循环中
- 【iOS】CoreBluetooth5 作为 Central 时的数据读写(OTA 固件升级与文件传输)
- UITabBarController、TabBar背景颜色设置、TabBarItem颜色处理
- #147 – Use SetCurrentValue When You Want to Set A Dependency Property Value from Within a Control
- java中String、StringBuffer、StringBuilder的总结
- Establishing a Build Environment
- fuel8: fuel master配置
- 去掉UITableView的section的粘性,使其不会悬停
- 【WPF】Combobox指定选中值用selectedValue不是很灵的时候,
- Poj 2524 Ubiquitous Religions
- salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)