$\huge \color{orange}{成魔之路->}$ $\huge \color{purple}{算法提高课题解}$
本题思路:
1. 如果 f[j] > f[j - v] + w,那么 f[j] = f[j],g[j] = g[j](可省略)
2. 如果 f[j] < f[j - v] + w,那么 f[j] = f[j - v],g[j] = g[j - v]
3. 如果 f[j] == f[j - v] + w,那么 g[j] += g[j - v]
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010, mod = 1e9 + 7;
int n,m;
int f[N]; //从前 i 个物品中选,体积不超过 j 的最大价值
int g[N]; //当 f[j] 取到最大价值时的方案数
int main()
{
cin>>n>>m;
for(int i=0;i<=m;i++) g[i]=1;
for(int i=0;i<n;i++)
{
int v,w;
cin>>v>>w;
for(int j=m;j>=v;j--)
{
if(f[j]<f[j-v]+w) //后者更大
{
f[j]=f[j-v]+w;
g[j]=g[j-v];
}
else if(f[j]==f[j-v]+w) g[j]=(g[j]+g[j-v])%mod; //一样大
// else //前者更大可省略
// {
// f[j]=f[j];
// g[j]=g[j];
// }
}
}
cout<<g[m]<<endl;
return 0;
}