1 //求方案数 定义状态f[i][j] 用前i件物品恰好放够体积为j的背包 方案数 2 #include<bits/stdc++.h> 3 using namespace std; 4 const int maxm=10005; 5 const int maxn=105; 6 int n,m,v[maxn],f[maxn][maxm]; 7 int main() 8 { 9 scanf("%d%d",&n,&m); 10 for(int i=1;i<=n;++i) scanf("%d",&v[i]); 11 f[1][v[1]]=1;//边界 12 for(int i=1;i<=n;++i) 13 for(int j=1;j<=m;++j) 14 { 15 f[i][j]=f[i-1][j];//用前i-1件恰好放够 16 if(j>v[i]) f[i][j]+=f[i-1][j-v[i]];//用前i-1件放一部分 再用这件填上剩下的部分 17 if(j==v[i]) ++f[i][j];//只用这一件就能放够 18 } 19 printf("%d",f[n][m]); 20 return 0; 21 }