首页 > 其他分享 >回溯法解决01背包问题

回溯法解决01背包问题

时间:2023-05-01 22:13:45浏览次数:28  
标签:10 01 int things number 背包 回溯 物品 thingsCount

#include <iostream>
using namespace std;

struct thing {
    int weight;//物品重量
    int value;//物品价值
    int number;//物品数量
};

thing things[10];//假设最多有10个物品

int thingsCount;//物品数量
int bagSize;//背包容量
int maxTotalValue;//最大总重量
int currentWeight;//当前重量
int currentValue;//当前价值
int currentPath[10];//存储当前路径
int bestPath[10];//存储最优路径
void bruteForce(int number) {//蛮力法,参数为物品序号
    if (number > thingsCount - 1) {//最内层函数的返回条件:当已经遍历到最后一个物品时
        if (currentValue > maxTotalValue) {//若当前重量更大,只有当前容量小于背包容量才可以更新
            maxTotalValue = currentValue;
            for (int i = 0; i < number; i++) {
                bestPath[i] = currentPath[i];//将当前路径用最优路径数组保存
            }
        }
    }
    else {
        for (int i = 1; i >= 0; i--) {
            currentPath[number] = i;
            if (i) {
                if (currentWeight + things[number].weight <= bagSize) {//满足条件才将物品装包,否则就不装包,直接“剪枝”
                    //序号为number+1的物品装入背包的情况
                    currentWeight += things[number].weight;
                    currentValue += things[number].value;
                    bruteForce(number + 1);//向下递归
                    currentWeight -= things[number].weight;
                    currentValue -= things[number].value;
                }
            }else {
                //序号为number+1的物品不装入背包的情况
                bruteForce(number + 1);//向下递归
            }
        }
    }
}

int main() {
    //初始化物品数、背包容量和物品数组
    cin >> thingsCount;
    cin >> bagSize;
    for (int i = 0; i < thingsCount; i++) {
        cin >> things[i].weight >> things[i].value;
    }
    //回溯法计算最优组合
    bruteForce(0);
    cout << maxTotalValue << endl;
    return 0;
}

//请输入物品数:4
//请输入背包容量:10
//请输入序号为1的物品的重量和价值 : 7 42
//请输入序号为2的物品的重量和价值 : 3 12
//请输入序号为3的物品的重量和价值 : 4 40
//请输入序号为4的物品的重量和价值 : 5 25

 

标签:10,01,int,things,number,背包,回溯,物品,thingsCount
From: https://www.cnblogs.com/Jocelynn/p/17367083.html

相关文章

  • 回溯法解n皇后问题
    #include<iostream>usingnamespacestd;#defineMAX21intarr[MAX];//arr[i]=k,表示在第i行的第k个位置放置一个皇后intsum;//计数解的个数intn;//记录几行几列boolcmp(introw,intcol){//当前行和列for(inti=1;i<row;i++){if(col==ar......
  • 摄影-230501
    ......
  • 回溯法解工作分配问题
    #include<iostream>usingnamespacestd;inta[100][100],sum=0,minn=2147483647,i,j,n;intb[100];voiddfs(intdep){intr;for(r=1;r<=n;++r)//dep表示第几个人,r表示工作if(!b[r])//如果第r件工作没有被选择{......
  • 2023-05-01:给你一个整数 n , 请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1
    2023-05-01:给你一个整数n,请你在无限的整数序列[1,2,3,4,5,6,7,8,9,10,11,...]中找出并返回第n位上的数字。1<=n<=2^31-1。输入:n=11输出:0解释:第11位数字在序列1,2,3,4,5,6,7,8,9,10,11,...里是0,它是10的一部分。答案2023-05-01:该......
  • 分支限界法解01背包问题
    #include<iostream>usingnamespacestd;#defineMAX100structNode{intisVisit;//记录节点是否被扩展doublew;doublev;intlevel;//记录节点所在的层次doubleub;//上界Node*parent;//父节点};doublemaxValue=0;Node*PT[MAX......
  • P5336 [THUSC2016]成绩单
    题意:期末考试结束了,班主任L老师要将成绩单分发到每位同学手中。L老师共有\(n\)份成绩单,按照编号从\(1\)到\(n\)的顺序叠放在桌子上,其中编号为\(i\)的的成绩单分数为\(W_i\)。成绩单是按照批次发放的。发放成绩单时,L老师会从当前的一叠成绩单中抽取连续的一段,让这......
  • 2023-05-01:给你一个整数 n , 请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1
    2023-05-01:给你一个整数n,请你在无限的整数序列[1,2,3,4,5,6,7,8,9,10,11,...]中找出并返回第n位上的数字。1<=n<=2^31-1。输入:n=11输出:0解释:第11位数字在序列1,2,3,4,5,6,7,8,9,10,11,...里是0,它是10的一部分。答案2023-05-01:......
  • 2017年计算机应用专业学术硕士毕业时的部分简历——“胡编内容版本”
      项目经验:硕士期间曾参与教育部人文社会科学研究青年基金,“轻量级数据集成环境下基于语义元数据的商务智能实现技术研究“。在该项目使用100台浪潮英信服务器对运行环境进行假设,采用Hadoop大数据处理框架对1TB的语言文本资料进行自然语言分析和处理,并采用yarn架构对资源......
  • 2018年-前端日记
    2018年4月份2018-04-25userAgent相关:判断微信内置浏览器的UserAgent2018-04-26前端相关:流程图制作工具:ProcessOnapi方法的浏览器兼容性问题,可以在这个网站上看:https://caniuse.com/CSS3的兼容性问题,不一定要使用-webkit-,-moz-,-o-,-ms-等私有前缀。可以使用Po......
  • 2019-推荐文章
    前言记录平时遇到的优质技术文章,按时间先后排序。内容2019-05-11《博客园美化教程大集合----极致个性化你的专属博客(超详细,看这篇就够了)》网上写图文教程的人,还真是贴心。2019-09-06https://www.yuque.com/sxc/front/kvokg4作者在语雀上的系列文章,都值得一看。2019-1......