首页 > 其他分享 >多重背包.

多重背包.

时间:2022-12-27 13:03:25浏览次数:41  
标签:多重 背包 temp int 100005 ++ ans ind


题目描述
给有一个能承重 V 的背包,和n种物品,每种物品的数量有限多,我们用重量、价值和数量的三元组来表示一个物品,第 i 件物品表示为(Vi,Wi,Si),问在背包不超重的情况下,得到物品的最大价值是多少?

输入
第一行输入两个数V、n,分别代表背包的最大承重和物品种类数。

接下来 n 行,每行三个数 Vi、Wi、Si,分别代表第 i 种物品的重量、价值和数量。

输出
输出一个整数,代表在背包不超重情况下所装物品的最大价值。

样例输入1

15 4
4 10 5
3 7 4
12 12 2
9 8 7

样例输出1

37

数据规模与约定
时间限制:1 s

内存限制:64 M

60% 的数据保证(Vi≤V≤1000,n≤100,Si≤10,Wi≤1000)
100% 的数据保证(Vi≤V≤100000,n≤100,Si≤100000,Wi≤1000)

#include <iostream>
using namespace std;

int all, n, ind, w[100005], v[100005], ans[100000];

int main() {
cin >> all >> n;
for (int i = 0; i < n; i++) {
int x, y, z;
cin >> x >> y >> z;
for (int j = 0; j < z; j++) {
ind++;
w[ind] = x;
v[ind] = y;
}
}
for (int i = 1; i <= ind; i++) {
for (int j = all; j >= w[i]; j--) {
ans[j] = max(ans[j], ans[j - w[i]] + v[i]);
}
}
cout << ans[all] << endl;
return 0;
}

二进制优化

#include <iostream>
using namespace std;

int all, n, ind, w[100005], v[100005], ans[100005];
int t[20];

int main() {
int tt = 1;
for (int i = 0; i < 20; i++) {
t[i] = tt;
tt *= 2;
}
cin >> all >> n;
for (int i = 0; i < n; i++) {
int x, y, z, temp = 0;
cin >> x >> y >> z;
while (z > 0) {
ind++;
if (z >= t[temp]) {
w[ind] = x * t[temp];
v[ind] = y * t[temp];
z -= t[temp];
} else {
w[ind] = x * z;
v[ind] = y * z;
z = 0;
}
temp++;
}
}
for (int i = 1; i <= ind; i++) {
for (int j = all; j >= w[i]; j--) {
ans[j] = max(ans[j], ans[j - w[i]] + v[i]);
}
}
cout << ans[all] << endl;
return 0;
}


标签:多重,背包,temp,int,100005,++,ans,ind
From: https://blog.51cto.com/u_15923796/5972669

相关文章

  • 代码随想录 - 背包问题
    vector<int>weight={1,3,4};vector<int>value={15,20,30};intbagWeight=4;//01背包如果先遍历背包后遍历物品那就是每个包只会装一......
  • 制作多重启动光盘——启动易(EasyBoo…
    点这里下载==》启动易(EasyBoot)v5.12简体中文版用EasyBoot刻盘正好可以解决这个问题。EasyBoot是一款集成化的中文启动光盘制作工具,它可以制作光盘启动菜单、自......
  • Pytest插件pytest-assume多重断言
    Pytest插件pytest-assume多重断言背景importpytestdeftest_assume1():assert1==2print('hello')assert2==3if__name__=='__main__':......
  • AcWing.7 混合背包问题
    题目描述有\(N\)种物品和一个容量是\(V\)的背包。物品一共有三类:第一类物品只能用1次(01背包);第二类物品可以用无限次(完全背包);第三类物品最多只能用\(s_i\)次(多......
  • 背包模型
    背包模型概述​最长上升子序列:序列DP(相邻两个被选择的有关系)背包问题:组合DP,在全局的考虑之下最小f[i][j]:i表示搞了多少,j表示限制集合:所有仅仅从前i个物品当中选......
  • Acwing 12. 背包问题求具体方案
    Acwing12.背包问题求具体方案01背包问题,但是要求输出字典序最小的方案数。思路:状态转移方程:\(f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i])\)求具体......
  • P1757 通天之分组背包
    P1757通天之分组背包有\(N\)件物品和一个容量为\(V\)的背包。第\(i\)件物品的费用是\(C_i\),价值是\(W_i\)。这些物品被划分为\(K\)组,每组中的物品互相冲突,最......
  • Acwing 7. 混合背包问题
    Acwing7.混合背包问题有\(N\)种物品和一个容量是\(V\)的背包。物品一共有三类:第一类物品只能用\(1\)次(01背包);第二类物品可以用无限次(完全背包);第三类物品最多......
  • Acwing 6. 多重背包问题 III
    单调队列优化法从公式入手来看是否还有可以改进的地方\(dp[i][j]=max(dp[i-1][j],dp[i-1][j-v]+w,dp[i-1][j-2*v]+2*w,...,dp[i-1][j-s_i*v]+s_i*w)\)我们......
  • Educational DP Contest E - Knapsack 2 (01背包)
    https://atcoder.jp/contests/dp/tasks/dp_e题目大意:有N个物品,编号为1,2,…,N。对于每个i(1≤i≤N),物品I的权重为wi,价值为vi。Taro决定从N件物品中挑选一些,用背包带回家......