3 20 20 20
3
枚举,最大2^20.
递归求解
1
#include<stdio.h>
2
#include<string.h>
3
#include<algorithm>
4
#include<iostream>
5
using namespace std;
6
int a[50];
7
int way(int w, int k)
8
{
9
if(w==0) return 1;
10
if(k==0) return 0;
11
else
12
return way(w, k-1)+way(w-a[k], k-1); //无限的循环,什么时候才是结尾(蛇吞尾)
13
}
14
int main()
15
{
16
memset(a, 0, sizeof(a));
17
int n;
18
cin>>n;
19
for(int i=1; i<=n; i++)
20
cin>>a[i];
21
cout<<way(40, n)<<endl;
22
return 0;
23
}
1
//动规方法求解
#include<iostream>
2
using namespace std;
3
int a[50];
4
int way[50][50]; //way[w][k]表示 k个元素组成w的方法数
5
int main()
6
{
7
int n;
8
cin>>n;
9
for(int i=1; i<=n; i++)
10
{
11
cin>>a[i];
12
way[0][i]=1;
13
}
14
way[0][0]=1;
15
for(int w=1; w<=40; w++)
16
for(int k=1; k<=n; k++)
17
{
18
way[w][k]=way[w][k-1]; //?
19
if(w-a[k]>=0)
20
{
21
way[w][k]+=way[w-a[k]][k-1]; //miracle
22
}
23
}
24
cout<<way[40][n];
25
26
return 0;
27
}