美文网首页工作生活
回溯法求0/1背包问题

回溯法求0/1背包问题

作者: 狼无雨雪 | 来源:发表于2019-07-15 14:07 被阅读0次

回溯法求0/1背包问题

给定n件物品和一个容量为c的背包,物品的重量为Wi,其价值为Vi,0/1背包问题是如何选择背包的物品,其中背包的物品是不可分割的,怎样使得背包中的物品价值最大?

#include"stdio.h"
#include"stdlib.h"
int num;//物品数量
double capability;//背包容量
double value[100];//每个物品价值
double weight[100];//每一个物品的重量
double currentWeight=0.0;//当前背包重量
double currentValue=0.0;//当前背包中物品价值
double bestValue=0.0;//当前最优价值
double valuePerThing[100];//单位物品价值
int order[100];//物品编号
int put[100]={0};//装入的物品
int savePut[100]={0};//保存最优值的设置
void sort(){//排序每件物品的单位价值
    int i,j;
    int tempOrder=0;
    double temp=0.0;

    for(i=1;i<=num;i++)
        valuePerThing[i]=value[i]/weight[i];
    for(i=1;i<=num-1;i++)
        for(j=i+1;j<=num;j++){
            if(valuePerThing[i]<valuePerThing[j]){
                temp=valuePerThing[i];
                valuePerThing[i]=valuePerThing[j];
                valuePerThing[j]=temp;
                tempOrder=order[i];
                order[i]=order[j];
                order[j]=tempOrder;
                temp=value[i];
                value[i]=value[j];
                value[j]=temp;
                temp=weight[i];
                weight[i]=weight[j];
                weight[j]=temp;
                    
            }
        }
}


double bound(int i){//确定 上届 
    double leftWeight=capability=currentWeight;
    double b=currentValue;
    while(i<=num&&weight[i]<=leftWeight){
        leftWeight-=weight[i];
        b+=value[i];
        i++;
    }
    if(i<=num)
        b+=value[i]/weight[i]*leftWeight;
    return b;
}
void backtrack(int i){//回溯过程函数 
    if(i>num){
        if(bestValue<currentValue){
            bestValue=currentValue;
            for(int j=0;j<num;j++){
                savePut[j]=put[j];
            }
        }
        return;
    }
    if(currentWeight+weight[i]<=capability){
        currentWeight+=weight[i];
        currentValue+=value[i];
        put[i]=1;
        backtrack(i+1);
        put[i]=0;
        currentWeight-=weight[i];
        currentValue-=value[i];

    }else{
    
            backtrack(i+1);
    } 
    if(bound(i+1)>bestValue)
        backtrack(i+1);
}
int main(){//主函数 
    int i;
    printf("请输入物品的数量和容量");
    scanf("%d%lf",&num,&capability);
    printf("请输入物品的重量和价值\n");
    for(i=1;i<=num;i++){
        printf("第%d个物品的重量:",i);
        scanf("%lf",&weight[i]);
        printf("价值是:");
        scanf("%lf",&value[i]);
        order[i]=i;
    }

    sort();
    backtrack(1);
    printf("最有价值为:%lf\n",bestValue);
    printf("需要装入的物品编号为:");
    for(i=1;i<=num;i++){
        if(savePut[i]==1){
            printf(" %d ",order[i]);

        }
    }
    printf("\n");
    system("PAUSE");
    return 0;
}

相关文章

  • 回溯法求0/1背包问题

    回溯法求0/1背包问题 给定n件物品和一个容量为c的背包,物品的重量为Wi,其价值为Vi,0/1背包问题是如何选择...

  • 0-1背包问题(回溯法)

    0-1背包问题 在0 / 1背包问题中,需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i...

  • 0-1背包问题(回溯法)

    0-1背包问题有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容...

  • 回溯法 0-1背包问题

    题目 给定n个重量为w1w1​,w2w2​,w3w3​,…,wnwn​,价值为v1v1​,v2v2​,v3v3​,...

  • 初识动态规划

    0-1 背包问题 备忘录 动态规划-二维数组 动态规划-一维数组 0-1 背包问题升级版 回溯算法 动态规划-二维...

  • 回溯算法---0-1背包问题

    引言:这道题目老师强调了肯定要考,所以只有硬着头皮将其复习了;下面是自己学习回溯算法的学习,仅供参考;一:基本概念...

  • 回溯算法:0-1背包问题

    测试验证: 结果为: 即选择第 2、3、5 个物品,不仅总重量没有超过背包容量,并且总的价值最大为:21

  • 回溯法解决背包问题

    问题描述: 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了...

  • 背包问题,使用回溯法

  • Algorithm进阶计划 -- 动态规划(下)

    经典动态规划背包问题最长子序列问题 1. 背包问题 1.1 0-1 背包问题 0-1 背包问题,描述如下: 上面...

网友评论

    本文标题:回溯法求0/1背包问题

    本文链接:https://www.haomeiwen.com/subject/nmodhctx.html