题目:
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1010,mod=1e9+7;
int n,m;
int f[N],g[N];
int main(){
cin>>n>>m;
//用01背包之刚好限制
memset(f, -0x3f, sizeof f);
f[0]=0;
g[0]=1;
for(int i=0;i<n;i++){
int v,w;
cin>>v>>w;
for(int j=m;j>=v;j--){
int maxv=max(f[j],f[j-v]+w);
int s=0;
//将每次最大的加起来
if(f[j]==maxv)s=g[j];
if(f[j-v]+w==maxv)s=(s+g[j-v])% mod;
f[j]=maxv,g[j]=s;
}
}
//因为限制是刚好所以最大的可能在最后一种状态的某个位置而不是最后一个位置
int res=0;
for(int i=1;i<=m;i++){
if(f[i]>f[res])
res=i;
}
//最后在最后一个状态统计出最大的有多少种
int sum=0;
for(int i=0;i<=m;i++){
if(f[i]==f[res])
sum=(sum+g[i])%mod;
}
cout<<sum<<endl;
return 0;
}