题意:
给你n个数,求可以用这些数组合出来的数的种数?(组合方式是加法).
分析:
对于恰好装满的01背包,最后的dp数组中元素只要不为INF,都可以被组合出来.统计不为INF的数的个数就可以了.
#include <cstdio>
#include <cstring>
const int maxn = (1e6 + 9) * 2, INF = 0x3fffffff, mod = 1e6;
typedef long long ll;
int a[39]; int t, n, sum, ans;
int dp[30009];
#define min(x, y) (x) < (y) ? (x) : (y)
int full(void) {
for (int i = 0; i <= sum; i++)
dp[i] = INF;
dp[0] = 0;
for (int i = 0; i < n; i++) {
for (int j = sum; j >= a[i]; j--) {
dp[j] = min(dp[j], dp[j - a[i]] + a[i]);
}
}
int ans = 0;
for (int i = 1; i <= sum; i++) {
if (dp[i] != INF) ans++;
}
return ans;
}
int main(void) {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
ans = sum = 0;
int mins = INF;
for (int i = 0; i < n; i++)
scanf("%d", &a[i]), sum += a[i], mins = min(mins, a[i]);
printf("%d\n", full());
}
return 0;
}