noi openjudge 数字组合
来源:互联网 发布:淘宝代发期刊靠谱吗 编辑:程序博客网 时间:2024/05/07 00:59
描述
有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式。如:
n=5,5个数分别为1,2,3,4,5,t=5;
那么可能的组合有5=1+4和5=2+3和5=5三种组合方式。
输入
输入的第一行是两个正整数n和t,用空格隔开,其中1<=n<=20,表示正整数的个数,t为要求的和(1<=t<=1000)
接下来的一行是n个正整数,用空格隔开。
输出
和为t的不同的组合方式的数目。
样例输入
5 51 2 3 4 5
样例输出
3
n <= 20 , 可以爆搜,也可以dp。
子集枚举,用二进制位表示状态,第 i 位为1表示选,否则不选。
代码如下
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,t;int num[450];int ans;int main(){ scanf("%d%d",&n,&t); int m = 1; for(int i = 1 ; i <= n ; i ++) scanf("%d",&num[i]) , m *= 2; m -= 1; for(int i = 1 ; i <= m ; i ++) { int temp = i; int k = 0; int now = 0; while(temp) { k ++; if(temp & 1) now += num[k]; temp >>= 1; } if(now == t) ans ++; } printf("%d\n",ans); return 0;}
dp可以设f[ i ] 为和为 i 的方案数 , f[ j ] = Σf[ j - num[ i ] ].
代码如下
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int f[1210];int num[1210];int main(){ int n,t; scanf("%d%d",&n,&t); f[0] = 1; for(int i = 1 ; i <= n ; i ++) scanf("%d",&num[i]); for(int i = 1 ; i <= n ; i ++) for(int j = t ; j >= num[i] ; j --) f[j] += f[j-num[i]]; printf("%d\n",f[t]); return 0;}/*5 51 2 3 4 5*/
4 0
- noi openjudge 数字组合
- Openjudge-noi 2985 数字组合
- 【openjudge】数字组合
- OpenJudge noi2985数字组合
- 【Openjudge, NOI,枚举】1749数字方格
- 数字组合-动态规划(01背包)-openjudge
- [OpenJudge-NOI]词典 stl
- [OpenJudge-NOI]Set stl
- [OpenJudge-NOI]List stl
- NOI OpenJudge 1159 Maze
- NOI OpenJudge 1805 碎纸机
- NOI OpenJudge 726 ROADS
- OpenJudge-Noi 1996 登山
- noi.openjudge 11207 机器翻译
- noi.openjudge 1909 直方图
- NOI openjudge 1792.迷宫
- openjudge noi 9278 旅行
- openjudge noi 1805 碎纸机
- QT集成开发环境的编译
- mybatis中的resultType和resultMap简单解释
- Android Studio中如何将ijkplayer 0.6.3导入自己的项目中并使用
- Jquery实现动态绑定单击时间,动态添加样式
- 转义及编码(\u, \x)
- noi openjudge 数字组合
- 【Java并发】一段代码
- 翻译 Dark Channel Prior based Image De-hazing: A Review
- object 未包含get_range的定义
- 原型链的继承
- 基于lxc的docker容器的disk-io监控方式
- 关于非阻塞的recv的时候返回的处理
- WebPack入门指南
- NOIP2011 Mayan游戏