(ΦωΦ)<これの答えですよー。目次はここ。
---
問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;
}
(ΦωΦ)<おしまい