您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习-递归(背包问题)

2016-05-31 17:02 477 查看

问题描述:

设有不同价值,不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过指定的限制重量,但选中的物品总价值最大。

代码:

#include <iostream>

using namespace std;
const int N=100;
int  limitw;
int totv;
int maxv;
int op
,cop
;
struct
{
int weight;
int value;
}a
;
int n;
void find(int i,int tw,int tv)
{
if(tw+a[i].weight<=limitw)
{
cop[i]=1;
if(i<n-1)
find(i+1,tw+a[i].weight,tv);
else
{
for(int k=0;k<n;k++)
op[k]=cop[k];
maxv=tv;
}
cop[i]=0;
}
if(tv-a[i].value>maxv)
{
if(i<n-1)
find(i+1,tw,tv-a[i].value);
else
{
for(int k=0;k<n;k++)
op[k]=cop[k];
maxv=tv-a[i].value;
}
}
}
int main()
{
int k,w,v;
cout<<"物品种数:";
cin>>n;
for(k=0,totv=0;k<n;k++)
{
cout<<"\t第"<<k+1<<"种物品(重量,价格):";
cin>>w>>v;
a[k].weight=w;
a[k].value=v;
totv+=v;
}
cout<<"背包能承受的重量:";
cin>>limitw;
maxv=0;
for(k=0;k<n;k++)
cop[k]=0;
find(0,0,totv);
cout<<"最佳填装方案是:"<<endl;
for(k=0;k<n;k++)
if(op[k]==1)
cout<<"\t第"<<k+1<<"种物品"<<endl;
cout<<"总价值="<<maxv<<endl;

return 0;
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: