AcWing 11. 背包问题求方案数
原题链接
中等
作者:
天空与海洋之间
,
2020-10-11 14:05:42
,
所有人可见
,
阅读 496
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010,V = 1010,INF = 0x3f3f3f3f,MOD = 1000000007;
int n,m;
int v[N],w[N];
int f[V],g[V];//f[i]表示体积恰好为i的最大价值,g[i]表示体积恰好为i的方案数
int main(){
cin >> n >> m;
for (int i = 1; i <= n; i++){
cin >> v[i] >> w[i];
}
f[0] = 0;
for(int j = 1; j <= m; j++) f[j] = -INF;//初始化为负无穷
g[0] = 1;
for(int i = 1; i <= n; i++){
for(int j = m; j >= v[i]; j--){
int t = max(f[j],f[j-v[i]]+w[i]);
//记录最优方案数
int s = 0;
if(t == f[j]) s += g[j];
if(t == f[j-v[i]] + w[i]) s += g[j - v[i]];
if(s >= MOD) s -= MOD;
f[j] = t;
g[j] = s;
}
}
int max_w = 0;//记录最大价值
for(int j = 0; j <= m; j++) max_w = max(max_w,f[j]);
int ans = 0;//记录最大价值对应的方案
for(int j = 0; j <= m; j++){
if(f[j] == max_w) {
ans += g[j];
if(ans >= MOD) ans -= MOD;
}
}
cout << ans << endl;
return 0;
}