#include<bits/stdc++.h>
using namespace std;
const int N = 1100, MOD = 1e9+7;
int v[N],w[N];
int f[N],g[N];//f[i][j]表示体积恰好为j的最大价值,g[i][j]表示f[i][j]为最大价值的方案数
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d%d",&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 cnt=0;
int opt1=f[j],opt2=f[j-v[i]]+w[i];
if(opt1>opt2){f[j]=opt1,cnt+=g[j];}
else if(opt1==opt2){f[j]=opt1,cnt+=g[j]+g[j-v[i]];}
else {f[j]=opt2,cnt+=g[j-v[i]];}
g[j]=cnt%MOD;
}
}
int res=0;
//f[i][j]定义的是体积恰好为j的最大价值,f[m]可能不存在,
//所以先求出最大价值,在统计所有成为最大价值的方案数
for(int i=0;i<=m;i++)res=max(res,f[i]);
long long cnt=0;
for(int i=0;i<=m;i++)
{
if(f[i]==res)
cnt=(cnt+g[i])%MOD;
}
cout<<cnt;
return 0;
}
AcWing 11. 背包问题求方案数
最新推荐文章于 2024-07-12 16:34:36 发布