ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第六章上机实验报告

2021-12-16 15:35:11  阅读:202  来源: 互联网

标签:Objs 上机 parent level int 第六章 实验报告 cw cv


第六章上机实验报告

7-1 0-1背包 (20 分)

给定n(n<=100)种物品和一个背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=1000)。问:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。

 

输入格式:

共有n+1行输入: 第一行为n值和c值,表示n件物品和背包容量c; 接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。

 

输出格式:

输出装入背包中物品的最大总价值。

 

输入样例:

5 10

2 6

2 3

6 5

5 4

4 6

结尾无空行

输出样例:

15

 

一、问题分析:

本题诗要求解在不超过背包总容量的前提下使得背包中物品价值达到最大,本题诗通过广度优先的方式遍历解空间树来解决此问题的,要通过广度优先的方式求解改的问题则要把要进行广度优先遍历的节点先保存在队列中,进而求解,当遍历到叶子节点时,把该节点从队列中移除,并记录下一个解,最后保存的解即为最优解。

 

二、代码

#include <iostream>

#include <queue>

using namespace std;

 

 

struct Node{

        int cv;

        int cw;

        int level;

};

 

struct Obj{

        int weight;

        int value;

}Objs[100];

 

queue<Node> q;

int bestv;

int n,c;

 

void dp(){

        Node root;

        root.cv = 0;

        root.cw = 0;

        root.level = 1;

        q.push(root);

        while(!q.empty()){

                 Node parent = q.front();

                 q.pop();

                 if(parent.level>n){

                         if(parent.cv>bestv){

                                  bestv = parent.cv;

                         }

                 }else{

                         if(parent.cw+Objs[parent.level].weight<=c){

                                  Node lchild;

                                  lchild.cv = parent.cv+Objs[parent.level].value;

                                  lchild.cw = parent.cw+Objs[parent.level].weight;

                                  lchild.level = parent.level +1;

                                  q.push(lchild);

                         }

                         Node rchild;

                                  rchild.cv = parent.cv;

                                  rchild.cw = parent.cw;

                                  rchild.level = parent.level +1;

                                  q.push(rchild);

                 }

        }

}

 

 

int main(int argc, char** argv) {

        cin>>n>>c;

        for(int i=1;i<=n;i++){

                 cin>>Objs[i].weight>>Objs[i].value;

        }

        dp();

        cout<<bestv<<endl;

        return 0;

}

 

三、实验心得

广度优先算法要求我们要对遍历解空间树有一个很清晰的理解,根据这个理解我们才能把代码相应遍历的部分写正确。广度优先方法也为求解一些问题提供了另一种解决方案。

标签:Objs,上机,parent,level,int,第六章,实验报告,cw,cv
来源: https://www.cnblogs.com/lyt9/p/lyt-guagndu.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有