输入样例:
4 4
1 1 2 2
输出样例:
3
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int n,m,a[N],dp[110][N];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=0;i<100;i++) dp[i][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
dp[i][j]=dp[i-1][j];
if(j>=a[i]) dp[i][j]+=dp[i-1][j-a[i]];
}
}
cout<<dp[n][m];
return 0;
}
优化第一维:
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int n,m,a[N],dp[N];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
dp[0]=1;
for(int i=1;i<=n;i++){
for(int j=m;j>=a[i];j--){
dp[j]+=dp[j-a[i]];
}
}
cout<<dp[m];
return 0;
}