递归算法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int a[30]; int N;
int Ways( int w, int k ) {
if( w==0 ) { return 1; }
if( k<=0 ) { return 0; }
return Ways(w, k-1) + Ways(w-a[k], k-1);
}
int main() {
cin >> N;
for( int i=1; i<=N; ++i ) {
cin >> a[i];
}
cout << Ways(40, N) << endl;
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
int a[40]; int N;
int Ways[50][40];
int main() {
cin >> N;
memset( Ways, 0, sizeof(Ways) );
for( int i=1; i<=N; ++i ) {
cin >> a[i] ;
Ways[0][i] = 1;
}
Ways[0][0] = 1;
for( int w=1; w<=40; ++w ) {
for( int k=1; k<=N; ++k ) {
Ways[w][k] = Ways[w][k-1];
if( w-a[k] >= 0 ) {
Ways[w][k] += Ways[w-a[k]][k-1];
}
}
}
cout << Ways[40][N] << endl;
return 0;
}