版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cd1202/article/details/51500128
实验题目:
编写一个程序exp5-2.cpp,求解背包问题,设有不同价值,不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过
指定的限制重量,但选中物品的总价值最大。
实验目的:
运行结果:
编写一个程序exp5-2.cpp,求解背包问题,设有不同价值,不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过
指定的限制重量,但选中物品的总价值最大。
实验目的:
灵活运用递归算法解决一些较复杂应用问题。
#include<iostream>
#include<cmath>
using namespace std;
#define N 100
int limitw; //限制的总重量
int totv; //全部物品的总价值
int maxv; //能装的最大价值
int n; //物品种数
int option[N];
struct things
{
int weight;
int value;
}a[N];
int knap(int s, int n)
{
if(s==0||n==0)
return 0;
else if((s>=a[n].weight)&&((knap(s,n-1))<(knap(s-a[n].weight,n-1)+a[n].value)))
{
option[n]=1;
return (knap(s-a[n].weight,n-1)+a[n].value);
}
else
{
option[n]=0;
return knap(s, n-1);
}
}
int main()
{
int k,w,v;
char b=',';
cout<<"物品种数:";
cin>>n;
for(totv=0,k=0; k<n; k++)
{
cout<<" 第"<<k+1<<"种物品(重量,价值)";
cin>>w>>b>>v;
a[k].weight=w;
a[k].value=v;
totv+=v;
}
cout<<"背包所能承受的总重量:";
cin>>limitw;
maxv=0;
for(k=0; k<n; k++)
option[k]=0;
maxv=knap(limitw,n);
cout<<"最佳装填方案是:"<<endl;
for(k=0; k<n; k++)
if(option[k])
cout<<"第"<<k+1<<"种物品"<<endl;
cout<<"总价值="<<maxv<<endl;
}
运行结果:
思路:
要想求解背包问题,要达到重量限定的情况下物品的总价值最高,要从最后一件物品开始试验,判断总物品的重量是否超重,并且保存其价值,然后倒数第二件、第三件……如果进行到某一件时物品总重量在限定重量之内,并且放入后价值比放入该物品前的价值大,则返回放入该物品后的总价值,否则返回不放入该件物品时的总价值。
算法
这里用到递归,重复用一个函数 knap()来选择具体方案,返回放入物品后的价值。
定义函数knap()定义s为背包容量,n为物品件数
首先 当背包的容量或者物品件数为0时,
则return 0;
否则
如果当背包容量大于或等于接下来要放入物品的重量并且放入物品后的价值大于不放入该物品的价值
则返回放入该物品后的价值。
否则
返回不放入该物品前的价值。
输入 物品种数以及物品的重量和价值,最大限重。
输出 最佳方案(即在不超重的情况下物品总价值最高)。