C++实验——背包问题

【实验名称】 背包问题
【实验目的】
掌握类的使用方法。

【实验原理】
给定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的情况下,包中物品总价值达到最大。
在使用类的过程中,对类的错误理解和应用导致程序运行时出现错误,最后通过查找资料解决问题。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值