什么都不选,方案数也是1,所以从0到n、m都要初始化为1
这是模板通解,应该还算清晰。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010, MOD = 1e9+7;
int n, m;
int f[N][N], g[N][N];
int main()
{
cin>>n>>m;
for(int i=0; i<=n; ++i)
for(int j=0; j<=m; ++j)
g[i][j] = 1;
for(int i=1; i<=n; ++i)
{
int v, w;
cin>>v>>w;
for(int j=0; j<=m; ++j)
{
f[i][j] = f[i-1][j];
g[i][j] = g[i-1][j]%MOD;
if(j>=v)
{
if(f[i][j] < f[i-1][j-v]+w)
{
f[i][j] = f[i-1][j-v]+w;
g[i][j] = g[i-1][j-v];
}
else if(f[i][j] == f[i-1][j-v]+w)
{
g[i][j] = (g[i][j]+g[i-1][j-v])%MOD;
}
}
}
}
cout<<g[n][m]<<endl;
return 0;
}
点赞!