3 20 20 20
3
枚举,最大2^20.
递归求解
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int a[50];
int way(int w, int k)
{
if(w==0) return 1;
if(k==0) return 0;
else
return way(w, k-1)+way(w-a[k], k-1); //无限的循环,什么时候才是结尾(蛇吞尾)
}
int main()
memset(a, 0, sizeof(a));
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
cout<<way(40, n)<<endl;
return 0;
//动规方法求解
int way[50][50]; //way[w][k]表示 k个元素组成w的方法数
way[0][i]=1;
way[0][0]=1;
for(int w=1; w<=40; w++)
for(int k=1; k<=n; k++)
way[w][k]=way[w][k-1]; //?
if(w-a[k]>=0)
way[w][k]+=way[w-a[k]][k-1]; //miracle
cout<<way[40][n];