01背包回溯法复杂度_【求助】0-1背包问题回溯法实现

01背包回溯法复杂度_【求助】0-1背包问题回溯法实现该楼层疑似违规已被系统折叠隐藏此楼查看此楼我用 w 5 2 2 6 5 4 p 5 6 3 5 4 6 进行验证 最优值应该是 15 可是输出结果是 14 include includeusing classKnap friendintKna int int int int public intBound inti void

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

我用w[5]={2,2,6,5,4},p[5]={6,3,5,4,6}进行验证,最优值应该是15,可是输出结果是14

#include

#include

using namespace std;

class Knap

{

friend int Knaspack(int *,int *,int ,int );

public :

int Bound(int i);

void Backtrack(int i);

int c;//背包承载物品的数量

int n;//物品数

int *w;//物品重量数组

int *p;//物品价值数组

int cw;//当前重量

int cp;//当前价值

int bestp;//当前最有价值

};

void Knap::Backtrack(int i)

{

if(i>n)//到达叶子结点

{

bestp=cp;

return ;

}

if(cw+w[i]<=c)//搜素左子树

{

cw+=w[i];

cp+=p[i];

Backtrack(i+1);

cw-=w[i];

cp-=p[i];

}

if(Bound(i+1)>bestp)//搜索右子树

Backtrack(i+1);

}

int Knap::Bound(int i)//计算上界

{

int cleft=c-cw;//剩余容量

int b=cp;

//以物品单位重量价值递减序装入物品

while(i<=n&&w[i]<=cleft)

{

cleft-=w[i];

b+=p[i];

i++;

}

//装满物品

if(i<=n)

b+=p[i]*cleft/w[i];

return b;

}

class Object

{

friend int Knaspack(int *,int *,int ,int );

public:

int operator<=(Object a)const

{

return (d>=a.d);

}

int ID;///物品编号

float d;//单位物品重量价值

};

int Knapsack(int p[],int w[],int c,int n)

{//初始化

int W=0;

int P=0;

Object * Q=new Object[n];

for(int i=1; i<=n; i++)

{

Q[i-1].ID=i;

Q[i-1].d=1.0*p[i]/w[i];

P+=p[i];/

W+=w[i];/

}

if(W<=c)//装入所有物品

return P;

//依照物品单位重量降序排序

float f;

for( i=1; i

for(int j=0; j

{

if(Q[j]<=Q[j+1])

{

f=Q[j].d;

Q[j].d=Q[j+1].d;

Q[j+1].d=f;

}

}

Knap K;

K.p=new int [n+1];

K.w=new int [n+1];

for( i=1; i<=n; i++)

{

K.p[i]=p[Q[i-1].ID];

K.w[i]=w[Q[i-1].ID];

}

K.cp=0;

K.cw=0;

K.c=c;

K.n=n;

K.bestp=0;

K.Backtrack(1);//从根开始搜索解空间树

delete[] Q;

delete[] K.w;

delete[] K.p;

return K.bestp;

}

int main()

{

int *p,*w,c,n;

int a[100];

int k=0;

while(cin>>n>>c && n+c)

{

w=new int [n+1];

for(int i=1; i<=n; i++)

cin>>w[i];

w[0]=0;

p=new int [n+1];

p[0]=0;

for( i=1; i<=n; i++)

cin>>p[i];

a[k]=Knapsack(p,w,c,n);

k++;

}

for(int i=0; i

{

cout<

}

return 0;

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176719.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:13
下一篇 2026年3月26日 下午9:13


相关推荐

  • meta标签设置用极速模式打开网页

    meta标签设置用极速模式打开网页1浏览器集成了多种浏览器内核,需要强制使用极速模式<metaname=”renderer”content=”webkit”/>2meta标签中X-UA-Compatible属性的使用的极速模式<metahttp-equiv=”X-UA-Compatible”content=”IE=edge,chrome=1″/>…

    2025年6月13日
    7
  • 数据库原理——事务、视图、存储过程

    数据库原理——事务、视图、存储过程

    2021年5月20日
    150
  • uml图六种箭头的含义

    uml图六种箭头的含义在看一些技术博客的时候 经常会见到博客里画上很多 uml 图 因为经常会被这几种表达关系的箭头搞混 这里我就把常见的 6 种箭头表达的含义理一下 泛化概念 泛化是一种一般与特殊 一般与具体之间关系的描述 具体描述建立在一般描述的基础之上 并对其进行了扩展 在 java 中用来表示继承的关系 表示方法 用实线空心三角箭头表示 实现概念 实现是一

    2026年3月18日
    2
  • Windows~~~在MySQL登录时出现Access denied for user ‘root‘@‘localhost‘ (using password: YES) ,并修改MySQL密码

    Windows~~~在MySQL登录时出现Access denied for user ‘root‘@‘localhost‘ (using password: YES) ,并修改MySQL密码适用于windows安装MySQL 对于出现拒绝访问root用户的解决方案 错误1045(28000):用户’root’@’localhost’(使用密码:YES)拒绝访问首先解析此英文:ERROR1045(28000):Accessdeniedforuser’root’@’localhost'(usingpassword:YES);解析的地方有…

    2022年6月13日
    29
  • 使用系统代理在Pycharm中无法发起请求

    使用系统代理在Pycharm中无法发起请求更新 urllib 版本为 1 25 11 pipinstallur 1 25 11 应该避免在使用抓包工具或代理的同时发起请求 如果你就是有这种需求 那就更改 ide 代理配置

    2026年3月17日
    2
  • python爬虫实时转发文章新闻;微信机器人使用;「建议收藏」

    python爬虫实时转发文章新闻;微信机器人使用;「建议收藏」前言:当前时间2022-4-24已经有五个月没水文章了!personally技术不增反退,咸扯蛋!今天搞个好玩的,用“鬼手”搞的免费版的微信pc端机器人+爬虫用来实时转发文章或新闻啥的!感谢“鬼手”免费分享的源码!(鄙人就单纯喜欢打感叹号!没其他意思!不是强调!)一、介绍“鬼手”的pc端微信使用先甩github链接:https://github.com/cixingguangming55555/wechat-bot里面有使用教程,但为了方便和本着就是讲细的原则还是说说吧。1、下

    2022年6月22日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号