背包问题:c++回溯法求解背包问题

1.问题的重述:

      给定n种物品和一个背包。物品i的重量是wi,其价值为pi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

2.问题的分析

      根据题目所给的信息可知就是在wi<c时可以放入物品,并且结合要求价值最大这一点来进行挑选,例如:

共有5种物品,即n=5;背包容量c=30;各物品的重量 wi[5]={15,5,6,12,9};各物品的价值为: p[i]={25,16,14,13,36};

所以所求背包中的物品的价值最大就是 while(wi<=c) p=max.当wi>c,退出,并且输出最大的价值p.

3.思路

     由于所给的信息较多,所以考虑用类来进行封装,这样看起来比较有清晰而且有条理。

源代码如下:
 

// Knapsack-1.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

class Bag
{
private :
	int c;  //背包容量
	int n;   //物品数量
	int *w;   //各物品重量
	int *p;   //各物品价值
	int *x;   //解向量
	int cw;   //当前重量
	int cv;   //当前价值
	int bestv;    //当前最优价值
	int *bestx;   //当前最优价值对应的解
public:
	Bag();
	~Bag();
	void Output();
	void Set(int n);
	void Input();
	void Ba
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值