题目传送门
解题思路:
其实本题可以看作在一个01背包里,所有物品可以组成价值的所有可能,找出那些某些物品价值和恰好等于背包中某一个物品的价值的所有方案数,所以跑01背包.
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 6 using namespace std; 7 8 int t,n,a[31],f[1001],ans,sum; 9 bool vis[31]; 10 11 int main() { 12 scanf("%d",&t); 13 for(int i = 1;i <= t; i++) { 14 scanf("%d",&n); 15 memset(a,0,sizeof(a)); 16 memset(f,0,sizeof(f)); 17 ans = 0; 18 for(int j = 1;j <= n; j++) { 19 scanf("%d",&a[j]); 20 sum = max(sum,a[j]); 21 } 22 f[0] = 1; 23 sort(a+1,a+n+1); 24 for(int j = 1;j <= n; j++) 25 for(int k = sum;k >= a[j]; k--) 26 f[k] += f[k-a[j]]; 27 for(int j = 1;j <= n; j++) 28 ans += f[a[j]]; 29 printf("%d ",ans - n); 30 } 31 return 0; 32 }