•   상한, 하한이 있는 문제 (sum은 중간에 0 에서 20 사이를 벗어나면 안되었다.)
  •   이것 때문에 dp 시작을 idx = 0, sum = 0 에서 하면 안되고 idx = 0 에서는 무조건 더하기만 가능했기 때문에 이를 구현하기 위해서 시작을 idx = 1, sum = tb1[0] 으로 해주어야 했다.
  •    1차원 cache로 구현하려고 오랫동안 고민했는데 ( 2차원으로 하는 문제란 걸 모르고 ) 2차원 배열로 sum의 경우까지 구분해 주어야 하는 것을 생각하지 못했었다. 질문 보기를 통해 알았다. idx 만으로 구분하기엔 뭔가 찜찜한 느낌은 있었는데 제대로 안 것 같다. 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <limits.h>

using namespace std;

typedef long long ull;

int n;
int tb1[111];
ull che1[110][21];

ull go(int idx, int sum){
    if(idx == n-1 && sum == tb1[idx]){
        return 1;
    }
    else if(idx == n-1){
        return 0;
    }
    if(sum > 20){
        return 0;
    }
    if(sum < 0){
        return 0;
    }

    ull& ret = che1[idx][sum];
    if(ret != -1){
        return ret;
    }
    ret = 0;
    ret = go(idx+1,sum+tb1[idx]) + go(idx+1,sum-tb1[idx]);
    return ret;
}

int main(void){
    memset(che1,-1,sizeof(che1));
    cin >> n;
    for(int i=0;i<n;++i){
        cin >> tb1[i];
    }
    cout << go(1,tb1[0]) << endl;
    
    return 0;
}




+ Recent posts