小美的数组构造
思路
求方案数,考虑用dp
:
前
个数之和等于
,且
每位都和
所有方案的方案数
代码
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 510, p = 1e9 + 7;
int dp[N][N];
int a[N];
int main() {
int n;
cin >> n;
int s = 0;
for(int i = 1; i <= n; i++) cin >> a[i], s += a[i];
dp[0][0] = 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= s; j++) {
for(int k = 1; k <= j; k++) {
if(k != a[i]) dp[i][j] = ((LL)dp[i][j] + dp[i-1][j - k]) % p;
}
}
cout << dp[n][s] << endl;
return 0;
}
// 64 位输出请用 printf("%lld")