[UVALive 6661 Equal Sum Sets] (dfs 或 dp)
2017-06-06 19:07
393 查看
题意:
求从不超过 N 的正整数其中选取 K 个不同的数字,组成和为 S 的方法数。
1 <= N <= 20 1 <= K<= 10 1 <= S <= 155
解题思路:
DFS:
因为N,K。S的范围非常小。直接DFS就可以。
/* ID: wuqi9395@126.com PROG: LANG: C++ */ #include<map> #include<set> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<string> #include<fstream> #include<cstring> #include<ctype.h> #include<iostream> #include<algorithm> #define INF (1<<30) #define PI acos(-1.0) #define mem(a, b) memset(a, b, sizeof(a)) #define For(i, n) for (int i = 0; i < n; i++) typedef long long ll; using namespace std; int n, k, s; int cnt = 0; void dfs(int sum, int x, int depth) { if (sum > s) return ; if (k - 1 == depth) { if (sum == s) cnt++; return ; } for (int i = x + 1; i <= min(n, s - sum); i++) dfs(sum + i, i, depth + 1); } int main () { while(scanf("%d%d%d", &n, &k, &s)) { if (n + k + s == 0) break; cnt = 0; for (int i = 1; i <= n; i++) { dfs(i, i, 0); } printf("%d\n", cnt); } }
DP:
dp[i][j][k] = dp[i - 1][j][k] + dp[i - 1][j - i][k - 1] //dp[i][j][k]表示从不超过i的数字中选取k个数和为j的方法数。
/* ID: wuqi9395@126.com PROG: LANG: C++ */ #include<map> #include<set> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<string> #include<fstream> #include<cstring> #include<ctype.h> #include<iostream> #include<algorithm> #define INF (1<<30) #define PI acos(-1.0) #define mem(a, b) memset(a, b, sizeof(a)) #define For(i, n) for (int i = 0; i < n; i++) typedef long long ll; using namespace std; int dp[22][160][11]; int n, k, s; int main () { dp[0][0][0] = 1; for (int i = 1; i <= 20; i++) { for (int j = 0; j <= 155; j++) { for (int k = 0; k <= 10; k++) { dp[i][j][k] = dp[i - 1][j][k]; if (k > 0 && j >= i) dp[i][j][k] += dp[i - 1][j - i][k - 1]; } } } while(scanf("%d%d%d", &n, &k, &s), n || k || s) printf("%d\n", dp [s][k]); }
相关文章推荐
- UVALive 6661 - Equal Sum Sets (类似硬币的DP问题)
- UvaLive 6661 Equal Sum Sets 二进制枚举/DP
- UvaLive6661 Equal Sum Sets dfs或dp
- UVALive 6661 - Equal Sum Sets
- UVALive 6661 Equal Sum Sets
- UVALive 6661 Equal Sum Sets
- LA 6661 —— Equal Sum Sets(DP)
- 6661 Equal Sum Sets(DP)
- UVALive6661 Equal Sum Sets
- Equal Sum Sets (DFS)
- Uvalive 6259 Word equations dfs+dp
- UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
- 【二项式定理】【DFS】UVALive - 7639 - Extreme XOR Sum
- UvaLive 6661 Equal Sum Sets (DFS)
- UVALive - 6916 Punching Robot Lucas+dp
- uvalive 3942 Remember the Word (字典树+DP)
- HDOJ 3664 Permutation Counting / UVALive 5092 DP
- UVaLive 3530 - Martian Mining (简单DP)
- UVALive 6620 Josephina and RPG(概率DP)
- uva live 3516 Exploring Pyramids 区间DP