oj2335——0-1背包问题

来源:互联网 发布:企业it解决方案 编辑:程序博客网 时间:2024/06/02 02:13
问题描述: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;}
程序运行结果展示:

知识点总结:贪心思想

学习心得:贪心算法有些情况不能解决一些问题,最标准解法为动态规划。