Top

(ΦωΦ)<これの答えですよー。目次はここ

---
問1-2
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 10010;
int n;
vector<int> p;
vector<vector<bool>> dp;

// 今i問目を解こうか解かないか悩んでいて、今までに獲得した得点はscore点。
// i問でscore点を獲得できるかどうかを返す。
bool rec(int i, int score) {
  if(dp[i][score]) { return dp[i][score]; }
  if(i == n) { return dp[i][score] = true; }
  return
    dp[i][score] = rec(i+1, score+p[i]) |
                   rec(i+1, score);
}

int main(void) {
  scanf("%d", &n);
  p.assign(n, 0);
  dp.assign(n+1, vector<bool>(N, false));
  for(int i=0; i<n; i++) { scanf("%d", &p[i]); }
  rec(0, 0);
  int res = 0;
  for(int i=0; i<N; i++) {
    if(dp[n][i]) { res++; }
  }
  printf("%d\n", res);
  return 0;
}
    

(ΦωΦ)<おしまい