正解走一遍,说明就不写了。

详见更多动态规划和背包问题

#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;
}
View Code