17.4.28 清北第一天水题

本文介绍了一种经典的计算机科学问题——多重背包问题,并提供了基于深度优先搜索(DFS)的解决方案。该问题要求在给定背包的最大承重下,从多种数量有限的物品中选择,以使总价值最大化。

多重背包

(backpack.cpp/c/pas)

(1s/256M)

 

题目描述

提供一个背包,它最多能负载重量为W的物品。

现在给出N种物品:对于第i类物品,一共有Ci件物品;对于每一件物品,重量为Wi,价值为Vi。

找出一种装载方式使得背包中的物品总价值最大。

 

输入格式(backpack.in)

第一行两个整数N,W,代表物品的种类与背包的总负重。

第2~N+1行,每行三个整数Wi, Vi, Ci,代表第i种物品的重量、价值与数量。

 

输出格式(backpack.out)

仅一行,一个整数V,代表最大的总价值。

 

样例输入

3 9

5 8 2

3 6 2

2 1 5

 

样例输出

14

 

数据范围与限制

1<=N<=20, 0<=W<=1000

1<=Wi<=100, 0<=Vi<=100, 0<=Ci<=100

多重背包:

1.动态规划

2.dfs

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 const int N = 25;
 5 int n, t;
 6 int w[N], v[N], c[N];
 7 int ans;
 8 void dfs(int x, int totw, int totv)
 9 {
10     if(x>n)
11     {
12         if(totv > ans) ans = totv;
13         return;
14     }
15     for(int i=0; i<=c[x] && totw + w[x]*i <= t; i++)
16         dfs(x+1, totw + w[x]*i, totv + v[x]*i);
17 }
18 int main()
19 {
20     scanf("%d%d", &n, &t);
21     for(int i=1; i<=n; i++) scanf("%d%d%d", &w[i], &v[i], &c[i]);
22     dfs(1, 0, 0);
23     printf("%d\n", ans);
24     return 0;
25 }

 

转载于:https://www.cnblogs.com/lyqlyq/p/6783104.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值