题目链接
11. 背包问题求方案数 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/11/今天是背包九讲的第八讲,背包问题求方案数,这道题其实跟day8货币系统类似,用01背包计算最值,用g数组记录路径,具体可以看“一只野生彩色铅笔”大佬的讲解
ac代码为
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010, mod = 1e9 + 7;
int n, m;
int f[N], g[N];
int main()
{
cin >> n >> m;
g[0] = 1;
for (int i = 1; i <= n; ++ i)
{
int v,w;cin>>v>>w;
for (int j = m; j >= v; -- j)
{
int temp = max(f[j], f[j - v] + w), c = 0;
if (temp == f[j]) c = (c + g[j]) % mod;
if (temp == f[j - v] + w) c = (c + g[j - v]) % mod;
f[j] = temp, g[j] = c;
}
}
int res = 0;
for (int j = 0; j <= m; ++ j)
{
if (f[j] == f[m])
{
res = (res + g[j]) % mod;
}
}
cout << res << endl;
return 0;
}