动态规划:多重背包问题

简介: 动态规划:多重背包问题

N种物品和一个容量是 V背包

i种物品最多有 si 件,每件体积是 vi,价值是 wi

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。

输出最大价值。


输入格式

第一行两个整数,NV,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。


输出格式

输出一个整数,表示最大价值。

数据范围

0<N,V≤100

0<vi,wi,si≤100

暴力解法:

#include<iostream>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N], s[N];
int dp[N][N];
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i] >> w[i] >> s[i];
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            for (int k = 0; k <= s[i] && k * v[i] <= j; k++)
            {
                dp[i][j] = max(dp[i][j], dp[i - 1][j - v[i] * k] + w[i] * k);
            }
        }
    }
    cout << dp[n][m] << endl;
    return 0;
}

使用二进制优化:

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 25000; 
int n, m;
int v[N], w[N];    //重量  价值
int dp[N];
int main()
{
    cin >> n >> m;
    int cnt = 0;
    for (int i = 0; i <= n; i++)
    {
        int a, b, s;   //体积  价值  数量
        cin >> a >> b >> s;
        int k = 1;     //k的取值 1 2 4 8 16 32 64 128 ....(k<=s)
        while (k <= s)
        {
            cnt++;
            v[cnt] = a * k;;
            w[cnt] = b * k;
            s -= k;
            k *= 2;
        }
        if (s > 0)
        {
            cnt++;
            v[cnt] = a * s;
            w[cnt] = b * s;
        }
    }
    //后面部分和01背包一样
    n = cnt;
    for (int i = 1; i <= n; i++)
    {
        for (int j = m; j >= v[i]; j--)
        {
            dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
        }
    }
    cout << dp[m] << endl;
    return 0;
}
目录
相关文章
|
6月前
|
算法 程序员
程序员必知:动态规划——背包问题1:01背包
程序员必知:动态规划——背包问题1:01背包
39 0
|
6月前
|
存储 算法
动态规划(背包问题)
动态规划(背包问题)
|
7月前
|
算法
动态规划—(背包问题)
动态规划—(背包问题)
|
7月前
|
消息中间件 Kubernetes NoSQL
动态规划- 背包问题总结(一)
动态规划- 背包问题总结(一)
|
7月前
|
消息中间件 Kubernetes NoSQL
动态规划- 背包问题总结(二)
动态规划- 背包问题总结(二)
|
算法 C语言 C++
【动态规划】多重背包问题,分组背包问题
与完全背包问题不同的是,每种东西都是有限件,前两种状态就不再过多赘述
151 4
|
存储 算法
动态规划之背包问题
动态规划之背包问题
100 0
|
算法 C语言 C++
【动态规划】背包问题(01背包,完全背包)
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
128 0
动态规划——多重背包、分组背包
动态规划——多重背包、分组背包
65 0
动态规划:完全背包问题
动态规划:完全背包问题
78 0
下一篇
DataWorks