【题目大意】
给定n个正整数$A_1,A_2,…,An$,从中选出若干个数使得和为m,求有多少种选择方案。
【思路解析】
真的是典型的0/1背包板子题,唯一改变的地方就是这道题要求的不是最值,而是方案数,所以转移方程就略有改变。
【代码实现】
1 #include<bits/stdc++.h> 2 #define rg register 3 #define go(i,a,b) for(rg int i=a;i<=b;i++) 4 #define back(i,a,b) for(rg int i=a;i>=b;i--) 5 #define ll long long 6 using namespace std; 7 const int N=102,M=10002; 8 int n,m,a[N]; 9 ll f[M]; 10 int main(){ 11 scanf("%d%d",&n,&m); 12 go(i,1,n) scanf("%d",&a[i]); 13 memset(f,0,sizeof(f)); 14 f[0]=1; 15 go(i,1,n) back(j,m,a[i]) 16 f[j]+=f[j-a[i]]; 17 printf("%lld ",f[m]); 18 return 0; 19 }