算法第五章实践

一 、 实践题目

工作分配问题

二 、 问题描述

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

输入格式:

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

输出格式:

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

输入样例:

3

10 2 3

2 3 4

3 4 5

输出样例:

9

三 、算法描述

进行回溯,遍历左子树后回溯遍历右子树

if(cp+w[i][x[j]]<bestp)

{

cp+=w[i][x[j]];

swap(i,j);

backtrack(i+1);

swap(i,j);

cp-=w[i][x[j]];

}

四、心得体会

和队友讨论之后了解到需要进行剪枝,来实现更少的时间复杂度,可以把算法设计的更加周密。

原文地址:https://www.cnblogs.com/Wqxxxx--/p/10165062.html

时间: 2024-07-31 09:41:38

算法第五章实践的相关文章

算法第五章实践报告

1. 实践题目 工作分配问题 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 3. 算

算法第五章上机实践报告

一 . 实践题目 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. 解空间 第一个人选择第几个工作,第

算法第五章上机实践

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

算法第五章小结

一.回溯算法的概念以及理解 概念:回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标. 理解:在回溯法中,每次扩大当前部分解时,都面临一个可选的状态集合,新的部分解就通过在该集合中选择构造而成.这样的状态集合,其结构是一棵多叉树,每个树结点代表一个可能的部分解,它的儿子是在它的基础上生成的其他部分解.树根为初始状态,这样的状态集合称为状态空间树. 二.“子集和”问题的解空间结构和约束函数 1.解空间结构 非负非零的整数集合 S = {x1, x2, …, xn}

【实践报告】算法第三章实践报告

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

算法第4章实践报告

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

算法第四章实践报告

1.选择第二题进行分析. 给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数.对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案. 输入 178543 4 输出132.问题描述:就是删掉指定数字中的一些数字,然后重新组成一个新的数使得这个数达到最小.3.算法描述:这个问题第一眼看下去容易想到对数组不停的排序然后不断删掉最大的,但是按着这个思路去做却发现,不断提取整型数组然后排序会比较复杂,因为要不断求余数等等,而且代码不

算法 第四章实践

1.实践题目 程序存储问题 2.问题描述 设有n 个程序{1,2,-, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是 li,1≤i≤n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序. 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数. 3.算法描述 for(int i=0;i<n;i++) cin>>a[i];//将程序的长度存放在数组之中 sort(a,a+n);//将数组中的元素排序 int num=

第五章实践

实践题目 :工作分配问题 问题描述:设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 算法描述(包括解空间,画出测试样例的解空间树,剪枝(约束函数或限界函数)方法描述) 这道题就是旅行售货员问题的同类 第一个判断条件是访问到最后一个人时与当前最优解进行比较 第二个是如果当前解大于当前最优解则不需要继续访问,可以减少时间(做的时候是>号,发现>=可能更好) 第三个判断当前任务是否被分配