一:最佳调度问题
1.问题描述
假设有n(n<=20)个任务由k(k<=20)个可并行工作的机器完成。完成任务i需要的时间为ti。 试设计一个算法,对任意给定的整数n和k,以及完成任务i 需要的时间为ti ,i=1~n。计算完成这n个任务的最佳调度,使得完成全部任务的时间最早。
输入格式:
输入数据的第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。
输出格式:
将计算出的完成全部任务的最早时间输出到屏幕。
输入样例:
7 3
2 14 4 16 6 5 3
输出样例:
17
2.程序代码
import java.util.*;
public class Main {
static int n, k;
static int[] machine; //机器加入的任务用时
static int[] task; //每个任务完成需要的时间
static int minTime;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
k = sc.nextInt();
task = new int[n];
machine = new int[k];
for(int i=0;i<n;i++) {
task[i] = sc.nextInt();
minTime+=task[i];
}
recursion(0);
System.out.println(minTime);
}
public static void recursion(int i) {
if(i<n) {
for(int j=0;j<k;j++) {
//由第j台机器完成第i项任务
machine[j]+=task[i];
if(machine[j]<minTime) {
//判断是否已经大于了现有的最小时间
recursion(i+1);
}
//第j机器不完成第i项任务
machine[j]-=task[i];
}
}
else {
int nowMaxTime = 0; //所有任务完成的最短时间取决于最后一个任务完成的机器的用时
for(int j=0;j<k;j++) {
nowMaxTime = Math.max(nowMaxTime, machine[j]);
}
minTime = Math.min(minTime, nowMaxTime); //保证用时的最短
}
}
}
二:666
1.问题描述
小明有一张m*n的好习惯记录卡,记录每一天的好习惯目标达成度(数字0-9表示)。某天目标完成达成,就在当天的格子里写上数字6,目标没有完全达成就写上一个小于6的数字(0-5),目标超额完成就写上一个大于6的数字(7-9)。记录卡上如果能找到一条长度为3的路径并且路径上的三个数字都大于等于6(这里的路径是指从某个格子出发,可以向左、右、上、下格子移动,并且不能重复经过一个格子),则小明就能得到一个“666”奖励。
请你帮小明统计下他总共能得到多少“666”奖励。
输入格式:
输入第一行给出两个正整数m,n(1=<m,n<=100),随后是m行,每行包含n个0-9之间的数字。
输出格式:
先输出m行,每行包括n个整数,代表从当前格子出发得到的“666”奖励个数,中