首先,我们说一下背包最原始的状态:选(1)与不选(0)。
我们设dp[i][j]为选了i个数且总和恰好等于0的最大方案数。
外框架是:
for (int i = 2;i <= n;i++) {
for (int j = 0;j <= num;j++) {
}
}
那么我们来看看选这个数的情况:如果j > i,那么这个数字才能选,选这个数的最大方案数就为不选与选的和。
不选的情况:直接传承。
if (j > i)//有取这个数和不取两种情况
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - i];(不选:dp[i - 1][j]:i - 1个数字为j的和的最大方案数)(选:dp[i - 1][j - i]:i - 1个数字为j - i的和的最大方案数)
else dp[i][j] = dp[i - 1][j];//只能不取
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, num, f[40][800];
signed main() {
scanf("%lld", &n);
num = n * (n + 1) / 2;
if (num % 2)
printf("