[UVALive 6661 Equal Sum Sets] (dfs 或 dp)

来源:互联网 发布:联通网络报修 编辑:程序博客网 时间:2024/05/03 10:56

题意:

求从不超过 N 的正整数当中选取 K 个不同的数字,组成和为 S 的方法数。

1 <= N <= 20  1 <= K<= 10  1 <= S <= 155


解题思路:

  DFS:

  由于N,K,S的范围很小。直接DFS即可。

/*ID: wuqi9395@126.comPROG: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.comPROG: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[n][s][k]);}


  

0 0
原创粉丝点击