动态规划---求解最优方案数

一:求解最优方案数背包问题

(一)求解最优方案数

(二)解题思路

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;
}

 

posted @ 2020-10-17 10:24  山上有风景  阅读(420)  评论(0编辑  收藏  举报