正解走一遍,说明就不写了。
详见更多动态规划和背包问题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> using namespace std; int dp[101][10001]; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } int main() { int a,m; a=read(); m=read(); int n[a]; for(int i=1;i<=a;++i) n[i]=read(); for(int i=1;i<=a;++i) for(int j=1;j<=m;++j) { if(j==n[i]) dp[i][j]=dp[i-1][j]+1; if(j>n[i]) dp[i][j]=dp[i-1][j]+dp[i-1][j-n[i]]; if(j<n[i]) dp[i][j]=dp[i-1][j]; } cout<<dp[a][m]; return 0; }