[UVALive 6661 Equal Sum Sets](dfs 또는 dp)

2460 단어 dpDFS
제목:
N을 초과하지 않는 정수 중에서 K개의 다른 숫자를 선택하여 S로 구성하는 방법을 구하십시오.
1 <= N <= 20  1 <= K<= 10  1 <= S <= 155
문제 해결 방법:
  DFS:
N, K, S의 범위가 매우 작기 때문이다.직접 DFS를 사용하면 됩니다.
/*
ID: [email protected]
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
", 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: [email protected]
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
", dp[n][s][k]); }

좋은 웹페이지 즐겨찾기