回溯篇---0-1背包问题NOJ1004

0-1背包问题:

时限:1000ms 内存限制:10000K 总时限:3000ms

问题描述:

需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。

输入:

多个测例,每个测例的输入占三行。第一行两个整数:n(n<=10)和c,第二行n个整数分别是w1到wn,第三行n个整数分别是p1到pn。
n 和 c 都等于零标志输入结束。

输出:

每个测例的输出占一行,输出一个整数,即最佳装载的总价值。

输入示例

在这里插入图片描述

输出示例在这里插入图片描述

基本思路

在这里插入图片描述
设n个物品,重量用数组w[1…n]存放,价值用v[1…n]存放,容量为c,用best[1…n]表示最优解,best[i]=0表示不放入背包,best[i]=1表示放入背包。由于每个物品要么装入,要么不装入,其解空间是一颗子集树,每个结点中有两个数值,前者表示放入背包中物品的总重量,后者表示总价值。

具体过程

见代码注释,因为之前写代码不太习惯写注释,所以每次在着手代码前会先描述下思路,忽然觉得这样不利于之后代码的复习,还是将过程具体到代码当中去了。

代码实现

#include <iostream>

using namespace std;

int n,c;//物品总数,背包容量
int w[100];//各物品重量
int v[100];//各物品价值

int c_w;//当前总质量
int c_v;//当前总价值
int best_v;//最优的价值

void dfs(int k);//回溯深搜
bool cut(int k);//剪枝
bool overweight(int k);


int main()
{
   
   scanf("%d %d",&n,&c);
  while(!(n==
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值