动态规划---求解最优方案数
一:求解最优方案数背包问题
(一)求解最优方案数
(二)解题思路
https://blog.csdn.net/lmmmmmmmmmmmmmmm/article/details/107376567
正常01背包即可,只需要多出一个数组,来保存各个取值下的数量
(三)算法实现
#include <iostream> #include <algorithm> using namespace std; const int N = 1010; int f[N], g[N]; //对应最大值,体重、价值 int n, m, mod = 1000000007,INF=1000000; int main() { cin >> n >> m; //输入物品组数、背包最大容量 for (int i = 1; i <= m; i++) f[i] = -INF; //除了f[0]为0,其他为负无穷,保证所有的代价从0迭代而来 g[0] = 1; for (int i = 0; i < n; i++) //循环物品组数 { int v, w; cin >> v >> w; for (int j = m; j >= v; j--) { int t = max(f[j], f[j - v] + w); int s = 0; if (t == f[i]) s += g[j]; if (t == f[j - v]+w) s += g[j - v]; if (s >= mod) s -= mod; f[j] = t; //获取最大值 g[j] = s; //获取方案数 } } int maxw = 0; //保存最大值 for (int i = 0; i < m; i++) maxw = max(f[i], maxw); int res = 0; //保存方案数 for (int i = 0; i < m; i++) { if (f[i] == maxw) { res += g[i]; if (res >= mod) res -= mod; } } cout << res << endl; system("pause"); return 0; }