题目描述
给定 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
算法1
(二维) $O(n^2)$
C++ 代码
#include <iostream>
using namespace std;
const int N=110,M=10010;
int f[N][M]; // f[i][j]--从前i个物品里面能取出和为j 的方案数
int a[N];
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++){
f[i][j]=f[i-1][j]; // 第i件不取
if(j>=a[i]) f[i][j]+=f[i-1][j-a[i]] ; // 第i件取
}
cout<<f[n][m];
return 0;
}
算法2
(一维) $O(n^2)$
C++ 代码
#include <iostream>
using namespace std;
const int N=110,M=10010;
int f[M];
int a[N];
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
f[0]=1;
for(int i=1;i<=n;i++)
for(int j=m;j>=a[i];j--)
f[j]+=f[j-a[i]] ;
cout<<f[m];
return 0;
}