【实验名称】 背包问题
【实验目的】
掌握类的使用方法。
【实验原理】
给定n种物品和一个背包,物品i的重量为Wi,其价值为Vi,背包容量为c。每种物品只有两种选择,要么全部装入包中,要么全部不装入包中,编写一个类,实现对物品的选择,使得装入包中所有物品的总重量不大于C的情况下,包中物品总价值最大。
(参考实例,c=5,W={2,1,3,2},V={12,10,20,15})
【实验内容】
(1)代码部分
【源代码】
#include<iostream>
#include<string.h>
using namespace std;
/**
*物品类
*/
class Goods{
public:
Goods(){}
///重量
int weight;
///价格
int value;
//是否将本物品加入包中
int flag;
};
/**
*背包类
*/
class Package{
public:
///容量
int capacity;
//c[k][y]为只允许装前k种物品,背包总重量不超过y的最大价值
//如c[1][2]表示只装前一种物品,总重量不超过2的情况下的最大价值
int c[10][100];
//goods[i].weight,goods[i].value,m:背包的容量,n:物品的数量
int knapsack(Goods goods[],int m,int n)
{
int i,j;
//将c中的值权设为0
memset(c,0,sizeof(c));
for(j=1;j<m+1;j++){
c[1][j]=j/goods[1].weight*goods[1].value;
}
//遍历所有的重量和价值
for(i=1;i<n+1;i++){
for(j=1;j<m+1;j++){
//当前背包所剩的容量 > 第i个物品的重量
if(j >= goods[i].weight){
//当前物品的价值加上上两个物品之前的所有物品的价值 大于 上一个物品之前所有物品的价值
if(goods[i].value+c[i-1][j-goods[i].weight]>=c[i-1][j]){
//添加物品
c[i][j] = goods[i].value+c[i-1][j-goods[i].weight];
}
//不添加物品
else{
c[i][j]=c[i-1][j];
}
}
//当前背包所剩的容量不足以放下第i个物品
else{
c[i][j]=c[i-1][j];
}
//输出c中所有的最大价值
cout<<c[i][j]<<" ";
}
cout<<endl;
}
return(c[n][m]);
}
};
int main(){
//物品数组
Goods goods[10];
//背包
Package package;
cout<<"请输入背包的容量 c= ";
cin>>package.capacity;
//物品的数目
int n;
cout<<"\n请输入物品数目 n= ";
cin>>n;
cout<<"\n请输入物品的重量: ";
int i;
for(i=1;i<n+1;i++)
{
cin>>goods[i].weight;
}
cout<<"\n请输入物品的价值: ";
for(i=1;i<n+1;i++)
{
cin>>goods[i].value;
}
cout<<endl;
//背包类计算最大价值
cout<<"输出每次循环的最大价值:"<<endl;
int maxValue = package.knapsack(goods,package.capacity,n);
cout<<"\n物品最重的最大价值为:"<<maxValue;
return 0;
}
(2)运行截图
【小结或讨论】
本次实验是用类来解决背包问题。在这个实验中,运用了动态规划的算法来求得每次循环中物品的最大价值,并进行输出,最后得到在使得装入包中所有物品的总重量不大于C的情况下,包中物品总价值达到最大。
在使用类的过程中,对类的错误理解和应用导致程序运行时出现错误,最后通过查找资料解决问题。