📄 beibao4.cpp
字号:
// 我真诚地保证:
// 我自己独立地完成了整个程序从分析、设计到编码的所有工作。
// 如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中
// 详细地列举我所遇到的问题,以及别人给我的提示。
// 在此,我感谢 XXX, …, XXX对我的启发和帮助。下面的报告中,我还会具体地提到
// 他们在各个方法对我的帮助。
// 我的程序里中凡是引用到其他程序或文档之处,
// 例如教材、课堂笔记、网上的源代码以及其他参考书上的代码段,
// 我都已经在程序的注释里很清楚地注明了引用的出处。
// 我从未没抄袭过别人的程序,也没有盗用别人的程序,
// 不管是修改式的抄袭还是原封不动的抄袭。
// 我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转。
// 徐潇然 00548065 智能科学系
/*
文件名称:beibao4
项目名称:beibao4
创建者:徐潇然
创建时间:9/26/2006
最后修改时间:9/26/2006
功能:用回溯搜索算法解决0/1背包问题
文件中的函数名称和简单功能描述:
Cbeibao4::input():输入关于背包问题的数据信息(背包总重量total_weight,物品件数number,
及每个物品的重量和价值),并为成员指针weight,value开辟动态空间
Cbeibao4::output():解问题,输出最大总价值和最优方案
Cbeibao4::f(int i):用回溯搜索算法对0/1背包问题进行求
文件中用到的他处定义的全局变量及其出处:无
与其他文件的依赖关系:无
*/
#include <iostream>
using namespace std;
/*
类名称:Cbeibao4
定义该类的目的:用回溯搜索算法解决0/1背包问题,并给出最优方案
类属性:
类中函数及功能:
input():输入关于背包问题的数据信息(背包总重量total_weight,物品件数number,
及每个物品的重量和价值),并为成员指针weight,value等开辟动态空间
output():解问题,输出最大总价值和最优方案
f(int i):用回溯搜索算法对0/1背包问题进行求解
与其他类的关系(调用/被调用哪类对象中的什么函数):无
*/
class Cbeibao4{
private:
double total_weight; //背包能容纳的总重量
int number; //物品件数
double *weight;//指向一个记录每个物品重量的数组
double *value; //指向一个记录每个物品价值的数组
int *x_current; //当前分支的物品取舍情况
int *x_max; //最大总价值时的物品取舍情况
double sum_value; //当前分支的总价值
double max_value; //最大总价值
double current_weight; //当前取过物品的总重量
/*
函数名称:input
函数功能描述:输入关于背包问题的数据信息(背包总重量total_weight,物品件数number,
及每个物品的重量和价值),并为成员指针weight,value等开辟动态空间
*/
void input();
/*
函数名称:f
函数功能描述:用回溯搜索算法对0/1背包问题进行求解
函数的输入参数:i表示当前搜索深度
*/
void f(int i); //i表示当前搜索深度
/*
函数名称:output
函数功能描述:解问题,输出最大总价值和最优方案
*/
void output();
public:
/*
函数名称:Cbeibao4
函数功能描述:构造函数,并实现问题的读入和答案的输出,从而解决该问题
*/
Cbeibao4(){
input();
output();
}
/*
函数名称:~Cbeibao4
函数功能描述:析构函数,并释放先前开辟的动态变量空间
*/
~Cbeibao4(){
delete weight;
delete value;
delete x_current;
delete x_max;
}
};
void Cbeibao4::input(){
cout<<"请输入背包可容纳的总重量w=";
cin>>total_weight;
cout<<"请输入物品的件数n=";
cin>>number;
cout<<"请分别输入这"<<number<<"个物品的重量:\n";
int i;
weight=new double[number];
for(i=0;i<number;i++)
cin>>weight[i];
cout<<"请分别输入这"<<number<<"个物品的价值:\n";
value=new double[number];
for(i=0;i<number;i++)
cin>>value[i];
x_max=new int[number];
x_current=new int[number];
for(i=0;i<number;i++)
x_max[i]=0; //初始时最大总价值的物品组合为无
max_value=0;//初始时最大总价值为0
current_weight=0;//初始时当前重量和为0
}
void Cbeibao4::output(){
f(0);
cout<<"最大总价值为"<<max_value<<endl;
cout<<"方案为(所取物品序号):\n";
int i;
for(i=0;i<number;i++){
if(x_max[i]==1)//若x_max[i]值为0,没选该物品;为1,则选
cout<<i+1<<" ";
}
cout<<endl;
}
void Cbeibao4::f(int i){
int j;
if(i==number){ //到达叶结点
sum_value=0;
for(j=0;j<number;j++)
sum_value=sum_value+value[j]*x_current[j];
if(sum_value>max_value){
max_value=sum_value;
for(j=0;j<number;j++)//找到总价值更大的情况,更新取舍情况
x_max[j]=x_current[j];
}
return;
}
x_current[i]=0;
f(i+1);//不装入物品i
if(current_weight+weight[i]<=total_weight){//物品i满足背包容量条件,可以选取
current_weight+=weight[i];
x_current[i]=1;
f(i+1);
current_weight-=weight[i];//回溯前清理现场
x_current[i]=0;
}
}
void main(){
Cbeibao4 obj;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -