AcWing 6. 多重背包问题 III(转化为 01 背包问题 单调队列优化)

题目链接:点击这里

在这里插入图片描述
在这里插入图片描述
不会,思路:https://www.acwing.com/solution/acwing/content/5163/

时间复杂度 O ( V N ) O(V N) ,AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 20010;

int dp[N], pre[N], q[N];
int n, m;

int main()
{
    cin >> n >> m;			//物品种数和背包容积 
	for (int i = 0; i < n; ++i)
	{
        memcpy(pre, dp, sizeof(dp));
        int v, w, s;		//物品的体积、价值和数量
        cin >> v >> w >> s;
        for (int j = 0; j < v; ++j)		//枚举余数0~v-1 
		{
            int head = 0, tail = -1;
            for (int k = j; k <= m; k += v)
			{
                if (head <= tail && k - s * v > q[head])
                    ++head;
                
                if (head <= tail)
                    dp[k] = max(dp[k], pre[q[head]] + (k - q[head]) / v * w);
                
                while (head <= tail && pre[q[tail]] - (q[tail] - j) / v * w <= pre[k] - (k - j) / v * w)
                    --tail;

                q[++tail] = k;
            }
        }
    }
    
    cout << dp[m] << endl;
    return 0;
}
发布了748 篇原创文章 · 获赞 113 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104373646