思路

求方案数,考虑用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")