UvaLive6661 Equal Sum Sets dfs或dp
题意:让你用1~n中k个不同的数组成s,求有多少种组法。
题解:
DFS或者DP或打表。
1.DFS 由于数据范围很小,直接dfs每种组法统计个数即可。
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<stack>
#include<queue>
using namespace std;
#define ll __int64
#define usint unsigned int
#define mz(array) memset(array, 0, sizeof(array))
#define minf(array) memset(array, 0x3f, sizeof(array))
#define REP(i,n) for(int i=0;i<(n);i++)
#define FOR(i,x,n) for(int i=(x);i<=(n);i++)
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define WN(x) printf("%d\n",x);
#define RE freopen("D.in","r",stdin)
#define WE freopen("1biao.out","w",stdout) const int maxn=;
bool h[maxn];
int ans;
int n,k,s;
void dfs(int x,int sum,int start) {
if(sum>s) return;
if(x==k) {
if(sum==s) ans++;
return;
}
for(int i=start; i<=n; i++) {
if(h[i]==false) {
h[i]=true;
dfs(x+,sum+i,i+);
h[i]=false;
}
}
return;
} int farm() {
memset(h,,sizeof(h));
ans=;
dfs(,,);
return ans;
} int main() {
while(scanf("%d%d%d",&n,&k,&s)!=EOF) {
if(n== && k== && s==) break;
//cout<<n<<','<<k<<','<<s<<endl;
printf("%d\n",farm());
}
return ;
}
2.DP
dp[i][k][j]代表用1~i中的数中的k个组成j的种类数。
dp[i][k][j]=dp[i-1][k][j] + dp[i-1][k-1][j-i],加号左边是继承1~i-1的种类数(因为1~i的种类数包括1~i-1的种类数),加号右边是给那些由k-1个数组成的种类加上i得到j的种类。
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<stack>
#include<queue>
using namespace std;
#define ll __int64
#define usint unsigned int
#define mz(array) memset(array, 0, sizeof(array))
#define minf(array) memset(array, 0x3f, sizeof(array))
#define REP(i,n) for(int i=0;i<(n);i++)
#define FOR(i,x,n) for(int i=(x);i<=(n);i++)
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define WN(x) printf("%d\n",x);
#define RE freopen("D.in","r",stdin)
#define WE freopen("1biao.out","w",stdout)
int n,k,s;
int dp[][][]; int main() {
int i,j,k;
int maxj;
mz(dp);
dp[][][]=;
for(i=; i<=; i++) {
for(k=; k<=; k++) {
dp[i][k][]=dp[i-][k][];
maxj=(i+i-k+)*k/;///此i和k能打到的最大的j
for(j=; j<=maxj; j++) {///dp[i][k][j],用数1~i中的k个组成j的种类数
dp[i][k][j]=dp[i-][k][j];///继承
if(j>=i) dp[i][k][j] += dp[i-][k-][j-i];///没i的状态加上i
}
}
}
while(scanf("%d%d%d",&n,&k,&s)!=EOF) {
if(n== && k== && s==) break;
//cout<<n<<','<<k<<','<<s<<endl;
printf("%d\n",dp[n][k][s]);
}
return ;
}
3.DP 空间降一维
dp[k][j]表示k个数组成j的种类数。
有一维要逆序for,防止同一i下重复计算。
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<stack>
#include<queue>
using namespace std;
#define ll __int64
#define usint unsigned int
#define mz(array) memset(array, 0, sizeof(array))
#define minf(array) memset(array, 0x3f, sizeof(array))
#define REP(i,n) for(int i=0;i<(n);i++)
#define FOR(i,x,n) for(int i=(x);i<=(n);i++)
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define WN(x) printf("%d\n",x);
#define RE freopen("D.in","r",stdin)
#define WE freopen("1biao.out","w",stdout)
int n,K,s;
int dp[][]; int main() {
int i,j,k;
int maxj;
while(scanf("%d%d%d",&n,&K,&s)!=EOF) {
if(n== && K== && s==) break;
mz(dp);
dp[][]=;
for(i=; i<=n; i++) {///用1到i中的数
for(k=K; k>; k--) {
for(j=i; j<=s; j++) {///dp[k][j],k个数组成数j的种类数
dp[k][j] += dp[k-][j-i];///没i的状态加上i
}
}
}
printf("%d\n",dp[K][s]);
}
return ;
}
4.打表
深搜怕超时可以怒打一表,只要不限制代码长度就随便过。
(代码太长了贴不上来)
UvaLive6661 Equal Sum Sets dfs或dp的更多相关文章
- [UVALive 6661 Equal Sum Sets] (dfs 或 dp)
题意: 求从不超过 N 的正整数其中选取 K 个不同的数字,组成和为 S 的方法数. 1 <= N <= 20 1 <= K<= 10 1 <= S <= 15 ...
- UvaLive 6661 Equal Sum Sets (DFS)
Let us consider sets of positive integers less than or equal to n. Note that all elements of a set a ...
- D.6661 - Equal Sum Sets
Equal Sum Sets Let us consider sets of positive integers less than or equal to n. Note that all elem ...
- Equal Sum Sets
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=49406 题意: 输入n,k,s,求在不小于n的数中找出k个不同的数 ...
- UVALive 6661 Equal Sum Sets
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- HDU-3280 Equal Sum Partitions
http://acm.hdu.edu.cn/showproblem.php?pid=3280 用了简单的枚举. Equal Sum Partitions Time Limit: 2000/1000 M ...
- POJ 1849 - Two - [DFS][树形DP]
Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets t ...
- 698. Partition to K Equal Sum Subsets
Given an array of integers nums and a positive integer k, find whether it's possible to divide this ...
- HDU 3280 Equal Sum Partitions(二分查找)
Equal Sum Partitions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
随机推荐
- 一次愚蠢的NOIP模拟赛
找礼物[find.pas/find.c/find.cpp] [问题描述] 新年到了,突然间,就在那美丽的一霎那,你好友和你(K个人)的周围满是礼物,你发扬你帅气的风格,让你的好友先拿,但是每个人只能拿 ...
- 【poj3342】 Party at Hali-Bula
http://poj.org/problem?id=3342 (题目链接) 题意 给出一棵树,要求在不存在两个节点相邻的条件下,选出尽可能多的节点,并且判断是否有多种选法. Solution 很水的树 ...
- 【poj1655】Balancing Act
http://poj.org/problem?id=1655 (题目链接) 题意 给出一棵树,求树上一点使得使得删除一点后该树的最大子树最小. solution 树的重心裸题. 随意取一点作为根节点, ...
- Non Lasting Storage File System、procfs、sysfs
catalog . 引言 . proc文件系统 . 简单的文件系统 . sysfs 0. 引言 传统上,文件系统用于在块设备上持久存储数据,但也可以使用文件系统来组织.提供.交换并不存储在块设备上的信 ...
- PHP滚动日志
PHP滚动日志类库 PHP记录日志,我之前接触过的有按照年月分文件夹,然后按照日分文件的日志记录方式,这种方式有利有弊,有他的使用场景,我今天要说的是另一种日志记录方式--文件滚动方式记录日志,当然了 ...
- 通过oauth 认证 新浪微博 开发过程中遇到的问题
1 Android之NetworkOnMainThreadException异常 http://blog.csdn.net/mad1989/article/details/25964495 ,从Hon ...
- 帝国cms栏目自定义字段首页调用
例如:增加栏目自定义字段:chushi_bpic 用下面的灵动标签和调用: [e:loop={"select C.classid,C.classname,C.classimg,D.chush ...
- Android MMS 之APN
APN的英文全称是Access Point Name,中文全称叫接入点,是您在通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络.用来标识GPRS的业务种类,目前分为两大类: ...
- POJ3114 Countries in War (强连通分量 + 缩点 + 最短路径 + 好题)
题目链接 题意是说在几个邮局之间传送一份信件,如果出发点和终止点在同一个国家传递,则时间为0,否则让你求花费最少时间,如果不能传到,则输出Nao e possivel entregar a carta ...
- IOS OC 计算器算法(不考虑优先级)
个人见解:为还在计算器算法方面迷惑的同学一个数据处理解决方案:定义一个可变数组array,一个可变字符串str,使字符通过[array addObject:str];方法添加到可变数组,每当触发运算符 ...