您的位置:首页 > 其它

oj2335——0-1背包问题

2017-05-18 11:42 211 查看
问题描述:0-1背包问题

试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。

 0-1 背包问题描述如下:给定n 种物品和一个背包。物品i 的重量是wi ,其价值为vi ,背包的容量为C。应如何选择装入背包的物品,使得装

 入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2 种选择,即装入背包或不装入背包。不能将物品i 装入背包多次,

 也不能只装入部分的物品i。

作者:何知令

完成时间:2017年5月18日

输入;

第一行有2个正整数n和c。n是物品数,c是背包的容量。接下来的1 行中有n个正整数,表示物品的价值。第3 行中有n个正整数,表示物品的重量。

输出:
将计算出的装入背包物品的最大价值和最优装入方案输出。第一行输出为:Optimal value is

解题思想:使用贪心思想,不断寻找性价比最高的物品将其装进包里,当物品中的最小质量大于包的剩余质量时结束循环;

代码:

/*
问题描述:0-1背包问题
试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。
0-1 背包问题描述如下:给定n 种物品和一个背包。物品i 的重量是wi ,其价值为vi ,背包的容量为C。应如何选择装入背包的物品,使得装
入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2 种选择,即装入背包或不装入背包。不能将物品i 装入背包多次,
也不能只装入部分的物品i。
作者:何知令
完成时间:2017年5月18日
输入;
第一行有2个正整数n和c。n是物品数,c是背包的容量。接下来的1 行中有n个正整数,表示物品的价值。第3 行中有n个正整数,表示物品的重量。
输出:
将计算出的装入背包物品的最大价值和最优装入方案输出。第一行输出为:Optimal value is
*/
#include <stdio.h>
#include <stdlib.h>
int findMax(float value[],int state[],int n)//查找未拿进包中的物品中性价比最高的物品
{
float max_value;
int i,place;
max_value=0;
for(i=0; i<n; i++)
{
if(max_value<value[i]&&state[i]==0)//若其状态为1,表示该物品没被拿进包中,可以选择拿进包中
{
max_value=value[i];
place=i;
}
}
state[place]=1;//拿进包中,将其状态置为1
return place;
}
int main()
{
int n;
int i;
int left_weight,minWeight,Optimal_value=0;//包剩于容量,物品中质量最小的物品的重量
float money[100],weight[100],value[100];//物品价值,质量,性价比
int state[100]= {0};
scanf("%d %d",&n,&left_weight);
for(i=0; i<n; i++)
scanf("%f",&money[i]);
for(i=0; i<n; i++)
scanf("%f",&weight[i]);
for(i=0; i<n; i++)
value[i]=money[i]/weight[i];
minWeight=weight[0];
for(i=1; i<n; i++)
{
if(minWeight>weight[i])
minWeight=weight[i];
}
while(left_weight>minWeight)//使用贪心思想,不断寻找性价比最高的物品将其装进包里,当物品中的最小质量大于包的剩余质量时结束循环。
{
i=findMax(value,state,n);
left_weight-=weight[i];
}
for(i=0;i<n;i++)
{
if(state[i]==1)
Optimal_value+=money[i];
}
printf("Optimal value is\n%d\n",Optimal_value);
for(i=0; i<n; i++)
printf("%d ",state[i]);
return 0;
}
程序运行结果展示:

知识点总结:贪心思想

学习心得:贪心算法有些情况不能解决一些问题,最标准解法为动态规划。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: