//DFS(暴力)版 #include<iostream> #include<cstdio> using namespace std; int n,m; int a[101]; long long ans; void dfs(int step,int s) { if(s==m){ ans++; return; } for(int i=step;i<=n;i++){ if(s+a[i]<=m) dfs(i,s+a[i]); } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); dfs(1,0); printf("%d",ans); return 0; }
抱歉,以上代码无法AC,正解如下:
//二维DP版(不习惯一维勿喷) #include<iostream> #include<cstdio> using namespace std; int a[101]; long long dp[101][10001]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) dp[i][0]=1; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(j>=a[i]) dp[i][j]=dp[i-1][j]+dp[i][j-a[i]]; else dp[i][j]=dp[i-1][j]; } } printf("%lld",dp[n][m]); return 0; }
一定要细心啊,输入输出什么的千万不要搞错。要开long long。如果连%lld都不会的话还是去用cout吧。。。