先把01背包模板打出来
然后先用一个数存着f[j-a]+b这个值
如果这个值大于f[j]
那么更新f[j]
它的方案数变为g[j-a]
否则如果它们相等
那么g[j]的方案数加上g[j-a]然后再取模1e9+7
最后输出最优选法的方案数
#include<bits/stdc++.h>
using namespace std;
const int N=1010,mod=1e9+7;
int f[N];//下标表示容积,f[N]表示在容积为N下的最大价值
int g[N];//表示容积为N时且价值最大的方案数
int v[N],w[N];
int s,V;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>s>>V;
for(int i=0;i<=V;i++)
g[i]=1;
for(int i=1;i<=s;i++){
cin>>v[i]>>w[i];
}
for(int i=1;i<=s;i++){
for(int j=V;j>=v[i];j--){
int t=f[j-v[i]]+w[i];
if(f[j]<t){
f[j]=t;
g[j]=g[j-v[i]];
}
else if(f[j]==t)
g[j]=(g[j]+g[j-v[i]])%mod;
}
}
cout<<g[V]<<endl;
return 0;
}