问题描述:
给定 N 个正整数 A1,A2,…,AN,从中选出若干个数,使它们的和为 M,求有多少种选择方案。
输入格式:
第一行包含两个整数 N和 M。
第二行包含 N 个整数,表示 A1,A2,…,AN。
输出格式:
包含一个整数,表示可选方案数。
数据范围:
1≤N≤100,
1≤M≤10000,
1≤Ai≤1000
输入样例:
4 4
1 1 2 2
输出样例:
3
思路详解:
题目是01背包问题的一个应用。我们可以将体积看作数的总和M,可以将价值看作选择方案的个数。
状态表示:f [ i ][ j ] 表示在第 i 个数之前选择体积恰好等于 j 的所有选择方案的个数。其值表示count.
状态转移:f [ i ] [ j ] = f [ i - 1][ j ] + f [ i - 1 ] [ j - v ] ; v 表示当前第 i 个数的值。
代码实现:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110;
int n, m;
int f[N][N];
int main(){
cin >> n >> m;
f[0][0] = 1;
for(int i = 0; i < n; i ++ ){
int t;
cin >> t;
for(int j = 0; j <= m; j ++ )
f[i][j] = f[i - 1][j] + f[i - 1][j - t];
}
cout << f[n - 1][m] << endl;
return 0;
}