状态表示
f[j]表示体积恰好为j的最大价值;
g[j]表示体积为j时,价值最优时的方案数;
状态转移方程
f[j]=max(f[j],f[j-v[i]]+w[i]);
#include<bits/stdc++.h>
using namespace std;
const int N=1010,mod=1e9+7,M=1000010;
int f[N],v[N],w[N],g[N];
int main()
{
int n,m,mxf=0;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
memset(f,-0x3f,sizeof f);
f[0]=0;g[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=v[i];j--)
{
int mx=max(f[j],f[j-v[i]]+w[i]);
int cnt=0;
if(mx==f[j]) cnt+=g[j];
if(mx==f[j-v[i]]+w[i]) cnt+=g[j-v[i]];
g[j]=cnt%mod; f[j]=mx;
mxf=max(f[j],mxf);
}
}
int cnt=0;
for(int i=1;i<=m;i++)
{
if(f[i]==mxf) cnt+=g[i];
}
cout<<cnt<<endl;
return 0;
}