算法第五章上机实践报告

一 . 实践题目

7-2 工作分配问题

二 . 问题描述

设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。

输入格式:

输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。

输出格式:

将计算出的最小总费用输出到屏幕。

输入样例:

3
10 2 3
2 3 4
3 4 5

输出样例:

9

三 . 算法描述

1. 解空间

第一个人选择第几个工作,第二个人选择第几个工作,第三个人选择第几个工作......

这道题是一个排列数问题

2.解空间树

3.约束函数

cc:当前总费用

bestc:当前最佳费用

if (cc+a[i][x[j]]<bestc){
            cc+=a[i][x[j]];
            swap(x[i], x[j]);
            Backtrack(i+1);
            swap(x[i], x[j]);
            cc-=a[i][x[j]]; 
  }

4.核心代码

void Backtrack (int i)
{
  if (i>n){
      if(cc < bestc){
          bestc = cc;
      }
      return;
  }
  else{
      for (int j=i;j<=n;j++) {
        if (cc+a[i][x[j]]<bestc){
            cc+=a[i][x[j]];
            swap(x[i], x[j]);
            Backtrack(i+1);
            swap(x[i], x[j]);
            cc-=a[i][x[j]];
        }
    }
   }
}

四 . 心得体会

我和同伴一开始对于回溯法的理解都不够,实验课的时候我们做第一题但是一直过不了,没有来得及看第二题。

课后做了第二题,对回溯法有了进一步的理解,但是我们现在做题还是依赖于去套框架,还需要加强理解。

原文地址:https://www.cnblogs.com/Ygrittee/p/10162269.html

时间: 2024-11-01 10:52:02

算法第五章上机实践报告的相关文章

揭露动态规划真面目——算法第三章上机实践报告

算法第三章上机实践报告 一.        实践题目 7-2 最大子段和 (40 分) 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5

贪心算法?我全都要!——算法第四章上机实践报告

算法第四章上机实践报告 一.        实践题目 4-1 程序存储问题 (90 分) 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是 li,1≤i≤n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序. 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数. 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L.接下来的1行中,有n个正整数,表示程序存放在磁带上的长度. 输出

算法第四章上机实践报告

一.实践题目:删数问题 二.问题描述: 给定一个n位的正整数a,去掉其中任意k(k≤n) 个数字后,剩下的数字按照原次序排列成一个的新的正整数.在给定的n位正整数a和正整数k的情况下,输出完成该操作后剩下的正整数. 三.算法描述: 正整数的位数不定,用long long去存不一定存的下,所以用一个字符数组str[]来存储.此处运用一种贪心策略,不停的对这个整数进行扫描,当发现当前位的后一位比当前位小的情况,将当前位删除(例如1873,删除8肯定比删除7更优),若所有位数的数字按照升序排列,则删除

算法第3章上机实践报告

1.实践题目  7-1 数字三角形 2.问题描述 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法, 计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 3.算法描述 求以一个的数为顶至底的数字总和 等于求以这个数左边或右边的数为顶至底的数字总和的最大值加上这个数本身 得出递推方程 m[i][j]=max( m[i+1][j], max[i+1][j+1] )+a[i][j] 从下至上填表 4.算法时间及空间复杂度分析 双重循环对维

算法第三章上机实践报告

实践题目 7-1 数字三角形 (30 分) 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 输入格式: 输入有n+1行: 第 1 行是数字三角形的行数 n,1<=n<=100. 接下来 n行是数字三角形各行中的数字.所有数字在0..99 之间. 输出格式: 输出最大路径的值. 输入样例: 在这里给出一组输入.例如: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5

算法第5章上机实践报告

一.实践题目 7-2 工作分配问题 (20 分) 设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 输入格式: 输入数据的第一行有1 个正整数n (1≤n≤20).接下来的n行,每行n个数,表示工作费用. 输出格式: 将计算出的最小总费用输出到屏幕. 输入样例: 在这里给出一组输入.例如: 3 10 2 3 2 3 4 3 4 5 输出样例: 在这里给出相应的输出.例如: 9 二.问题

第五章上机实践报告

1.实践问题: 工作分配问题 2.问题描述: 设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 3.算法描述: 1)解空间:排列树 2)测试样例的解空间树: 3)剪枝方法: void Backtrack(int t){ for(int k=1;k<=n;++k){ if(!b[k]){ b[k]=1; sum+=p[k][t]; if(t==n){ if(sum<best) best

算法第五章上机实践

实践题目 工作分配问题 问题描述 有n个人.n个工作,每个人只能做一个工作,每人对应每个工作有一个消费,求完成所有工作的最小消费 算法描述 这里采用回溯法,按顺序给每个人分配工作,如果一件工作已经被分配,打上标记防止被重复分配 分配过程中,如果当前的消费已经大于等于已知的最小消费,就停止对子节点的搜索. 心得体会 实际上这题还有优化空间和另外的解法. 可以用课本的方法通过排列组合来剪枝. 了解到的另外两种解法(本质上一样): 二分图完全匹配算法(匈牙利算法) 网络流--最小费用流(最小费用流也可

算法第三章上机实践报告之数字三角形

1.实践题目 7-1 数字三角形 (30 分) 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 输入格式: 输入有n+1行: 第 1 行是数字三角形的行数 n,1<=n<=100. 接下来 n行是数字三角形各行中的数字.所有数字在0..99 之间. 输出格式: 输出最大路径的值. 输入样例: 在这里给出一组输入.例如: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6