#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int n;
int money;
int arr[21];
int cnt;
int cache[10011][100];
int go(int sum,int index) {
       
       if (sum == 0) {
             return 1;
       }
       if (sum < 0) {
             return 0;
       }
       if (cache[sum][index] != -1) {
             return cache[sum][index];
       }
       cache[sum][index]++;
       int& ret = cache[sum][index];
       for (int i = index; i < n; ++i) {
             ret += go(sum - arr[i],i);
       }
       return ret;
}
int main(void)
{
       int t;
       cin >> t;
       while (t--) {
             memset(arr, 0, sizeof(arr));
             memset(cache, -1, sizeof(cache));
             cnt = 0;
             cin >> n;
             for (int i = 0; i < n; ++i) {
                    cin >> arr[i];
             }
             cin >> money;
             cout << go(money,0) << endl;
             
       }
       return 0;
}




#include <iostream>
#include <algorithm>
#include <cstring>
#include <limits.h>
#include <stack>
using namespace std;
typedef long long ll;
ll stb[10001]; // single table
ll sche[100001]; // single cache
int tb[1001][1001];
int cache[1001][1001];
int n,m;
const int mod = 1000000007;
int main(void) {
       int ans = 0;
       int a = 1;
       int b = 1;
       for (int i = 0; i < n; ++i) {
              ans += a%mod + b%mod;
              a = ans;
              b = a;
       }
       cout << ans%mod;
       
       
       
       return 0;
}

'알고리즘' 카테고리의 다른 글

[DP] 백준 1965 상자넣기  (0) 2018.04.29
[DP] 백준 9084 동전  (0) 2018.04.29
[DP] 백준 11051 이항계수2  (0) 2018.04.02
[DP] 백준 1965 상자넣기  (0) 2018.04.02
[EASY] 백준 2167 2차원 배열의 합  (0) 2018.04.02

이항계수 2 팩토리얼 값 미리 다이나믹으로 구해두고 나눠서 풀려고 했는데
나머지 연산이라 n은 본래 큰 값이지만 나머지는 n-m의 값보다 작을 수 있다. 해결할 방법이 지금 생각나지 않음.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <limits.h>
#include <stack>
using namespace std;
typedef long long ll;
ll stb[10001]; // single table
ll sche[100001]; // single cache
int tb[1001][1001];
int cache[1001][1001];
int n,m;
int facto(int num) {
       cout << num << endl;
       if (num == 0) {
              return 1;
       }
       if (sche[num] != -1) {
              return sche[num];
       }
       sche[num] = ((num%10007) * (facto(num - 1)%10007))%10007;
       cout << sche[num] << endl;
       return sche[num];
}
int main(void) {
       memset(sche, -1, sizeof(sche));
       cin >> n >> m;
       if (n == m || m == 0) {
              cout << 1 << endl;
              return 0;
       }
       facto(n);
       cout << sche[n] / sche[n - m] / sche[m] ;
       
       return 0;
}


이게 해법 곱하기와 나누기 말고 합으로 해결 가능했다. 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <limits.h>
#include <stack>
using namespace std;
typedef long long ll;
ll stb[10001]; // single table
ll sche[100001]; // single cache
int tb[1001][1001];
int cache[1001][1001];
int n,m;
int main(void) {
       
       cin >> n >> m;
       if (n == m || m == 0) {
              cout << 1 << endl;
              return 0;
       }
       cache[0][0] = cache[1][0] = cache[1][1] = 1;
       for (int i = 2; i <= n; ++i) {
              cache[i][0] = cache[i][i] = 1;
              for (int j = 1; j <= i-1; ++j) {
                     cache[i][j] = cache[i - 1][j - 1]%10007 + cache[i - 1][j]%10007;
              }
       }
       cout << cache[n][m]%10007;
       
       return 0;
}


'알고리즘' 카테고리의 다른 글

[DP] 백준 9084 동전  (0) 2018.04.29
[EAZY] 백준 15624 피보나치 7  (0) 2018.04.02
[DP] 백준 1965 상자넣기  (0) 2018.04.02
[EASY] 백준 2167 2차원 배열의 합  (0) 2018.04.02
[DP] 백준 14916 거스름돈  (0) 2018.04.02

+ Recent posts