递归标程:
#include<bits/stdc++.h>
#define maxn 100001
using namespace std;
int n,m,a[maxn],ans=0;
void dfs(int d,int s)
{
if(s>m) return;//不可或缺
if(d>n)
{if(m==s) ans++;}//要套括号
else
{
if(s+a[d]<=m) dfs(d,s+a[d]);
dfs(d+1,s);
}
}
int main()
{
cin>>m>>n;
for(int i=1;i<=n;i++) cin>>a[i];
dfs(1,0);
cout<<ans;
return 0;
}
动规标程:
#include<bits/stdc++.h>
#define maxn 100001
#define minn 305
using namespace std;
int t[minn],f[minn][maxn],n,m;
int main()
{
cin>>m>>n;
for(int i=1;i<=n;i++) cin>>t[i];
for(int i=0;i<=n;i++) f[i][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=f[i-1][j];
if(j>=t[i]) f[i][j]+=f[i][j-t[i]];
}
}
cout<<f[n][m];
return 0;
}