题目链接:0x52 A 数字组合
01背包问题:
#include<iostream>
using namespace std;
const int M = 10010,N = 110;
int n,m;
int f[M];
int v[N];
/*
状态表示:f[i][j]表示前i个数和为j的所有方案
状态转移:不选
f[i][j] = f[i - 1][j]
选
f[i][j] = f[i - 1][j] + f[i - 1][j - v[i]];
初始化:f[0][0] = 1;
res = f[n][m]
*/
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i ++ ) cin >> v[i];
f[0] = 1;
for(int i = 1; i <= n; i ++ ){
for(int j = m; j >= v[i]; j --){
f[j] += f[j - v[i]];
}
}
cout<<f[m]<<endl;
return 0;
}