第11周项目4- 利用遍历思想求解图问题(3)

问题及代码:/* * Copyright(c) 2017,烟台大学计算机学院 * All rights reserved. * 文件名称:cpp1. * 作 者:薛瑞琪 * 完成日期:2017 年 11 月 14 日 * 版 本 号:v1.0 * * 问题描述: 假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观
摘要由CSDN通过智能技术生成

问题及代码:

/*  
* Copyright(c) 2017,烟台大学计算机学院  
* All rights reserved.  
* 文件名称:cpp1.  
* 作    者:薛瑞琪  
* 完成日期:2017 年 11 月 14 日  
* 版 本 号:v1.0  
*  
* 问题描述: 假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观察输出值,掌握相关问题的处理方法。  
  (6)求不带权连通图G中从顶点u到顶点v的一条最短路径。 
  (7)求不带权连通图G中,距离顶点v最远的顶点k  
* 输入描述:无需输入  
* 程序输出:实现各种算法的函数的测试结果  
*/    

#include <stdio.h>
#include <malloc.h>
#include "graph.h"

//以下输出最短路径
typedef struct
{
    int data;                   //顶点编号
    int parent;                 //前一个顶点的位置
} QUERE;                        //非环形队列类型

void ShortPath(ALGraph *G,int u,int v)
{
    //输出从顶点u到顶点v的最短逆路径
    ArcNode *p;
    int w,i;
    QUERE qu[MAXV];             //非环形队列
    int front=-1,rear=-1;       //队列的头、尾指针
    int visited[MAXV];
    for (i=0; i<G->n; i++)      //访问标记置初值0
        visited[i]=0;
    rear++;                     //顶点u进队
    qu[rear].data=u;
    qu[rear].parent=-1;
    visited[u]=1;
    while (front!=rear)         //队不空循环
    {
        front++;                //出队顶点w
        w=qu[front].data;
        if (w==v)               //找到v时输出路径之逆并退出
        {
            i=front;            //通过队列输出逆路径
            while (qu[i].parent!=-1)
            {
                printf("%2d ",qu[i].data);
                i=qu[i].parent;
            }
            printf("%2d\n",qu[i].data);
            break;
        }
        p=G->adjlist[w].firstarc;   //找w的第一个邻接点
        while (p!=NULL)
        {
            if (visited[p->a
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,让我们来看一下这个问题。 首先,我们需要将问题转化为标准的背包问题形式。7.7(a)所示的问题中,每个物品有两个属性:重量和价值。我们可以将这两个属性分别作为背包问题中的物品重量和价值。然后再将每个物品拆分成多个子物品,每个子物品的重量都是原来物品的重量的一半。这样,我们就得到了标准的背包问题形式。 接下来,我们可以使用动态规划算法来解决这个问题。设 $f(i,j)$ 表示前 $i$ 个物品放入容量为 $j$ 的背包中所能获得的最大价值。状态转移方程为: $$ f(i,j) = \max\{f(i-1,j), f(i-1,j-w_i)+v_i, f(i-1,j-w_i/2)+v_i, f(i-1,j-w_i/2)-w_i/2+v_i, f(i-1,j-w_i)+w_i/2+v_i\} $$ 其中,$w_i$ 和 $v_i$ 分别表示第 $i$ 个物品的重量和价值。这个状态转移方程中的五个值分别表示不选第 $i$ 个物品、选第 $i$ 个物品、选第 $i$ 个物品的一半、不选第 $i$ 个物品的一半、选第 $i$ 个物品的一半并补足另一半的情况。 最终,我们的目标是求解 $f(n,W)$,其中 $n$ 表示物品的个数,$W$ 表示背包的容量。根据状态转移方程,我们可以使用一个二维数组来存储所有的状态值,然后在数组中查找 $f(n,W)$ 的值即可。 代码实现如下: ### 回答2: 算法7.7是用于求解0-1背包问题的动态规划算法。7.7(a)表示了背包问题的具体示例,其中有4个物品,它们的重量和价值分别为: 物品1:重量为2,价值为3 物品2:重量为3,价值为4 物品3:重量为4,价值为5 物品4:重量为5,价值为6 背包的容量为10,我们需要确定如何选择物品以使得背包中的总价值最大化。 首先,我们创建一个动态规划表格,表格的行表示物品,列表示背包容量。表格中的每个单元格表示当只考虑前i个物品,并且背包容量限制为j时的最大总价值。 具体的计算过程如下: 1. 初始化动态规划表格。这里我们需要一个5x11的表格来记录结果,其中行0和列0都初始化为0。 2. 对于每一个物品i,从1到4,依次行如下操作: a) 对于每个背包容量j,从1到10,依次行如下操作: - 如果物品i的重量wi大于当前背包容量j,则将表格中的当前单元格值设为表格中上一个单元格的值,即dp[i][j] = dp[i-1][j]; - 否则,将表格中的当前单元格值设为上一个单元格值和(上一个单元格对应的背包容量减去物品i的重量的单元格值加上物品i的价值)中的较大值,即dp[i][j] = max(dp[i-1][j], dp[i-1][j-wi] + vi)。 3. 最终,我们可以在动态规划表格的右下角找到最大总价值,即dp[4][10],它的值为11。 因此,根据算法7.7求解7.7(a)所示背包问题的结果为最大总价值为11。 ### 回答3: 7.7(a)所示的背包问题可以用算法7.7来求解。下面是具体的求解过程: 首先,我们需要定义问题的背包容量和物品的价值、重量。根据7.7(a),背包的容量为10,物品的价值和重量分别为[6, 5, 8, 9, 6]和[2, 3, 6, 7, 5]。 接下来,我们创建一个动态规划的二维数组dp,其中dp[i][j]表示前i个物品在容量为j的背包中的最大价值。初始化dp的第一行和第一列为0。 然后,我们利用动态规划的思想,从上至下、从左至右地填充dp数组。对于每一个位置dp[i][j],我们有两种选择:放入物品i或者不放入物品i。如果选择放入物品i,那么dp[i][j]的值为dp[i-1][j-w[i]] + v[i],表示当前背包容量减去物品i重量后的容量所能得到的最大价值再加上物品i的价值。如果选择不放入物品i,那么dp[i][j]的值为dp[i-1][j]。我们选择较大的值作为dp[i][j]的值。 最后,遍历完所有的物品和背包容量,dp数组的右下角的值dp[n][C]即为所求背包问题的最优解,其中n为物品的数量,C为背包的容量。 在本例中,计算完dp数组所有的值后,我们得到dp[5][10]的值为24。这说明,在背包容量为10的情况下,从这些物品中选择一些放入背包,能够得到的最大总价值为24。 因此,根据算法7.7的求解过程,7.7(a)所示的背包问题的最优解为24。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值