整数划分:
package com.etc.icss;
import java.util.HashMap;
import java.util.Map;
public class Test {
private static void getString(String t, int h, int o, Map<String, String> map) {
if (h > o) {
getString(t, o, o, map);
} else {
if (h < o) {
getString(h + "+" + t, h, o - h, map);
for (int i = h - 1; i >= 2; i--) {
getString(h + "+" + t, i, o - h, map);
}
} else {
String out = h + "+" + t;
out = out.substring(0, out.length() - 1);
map.put(out, out);
for (int i = h - 1; i >= 2; i--) {
getString(t, i, o, map);
}
}
String out = t + "";
for (int x = 0; x < o; x++)
out = 1 + "+" + out;
out = out.substring(0, out.length() - 1);
map.put(out, out);
}
}
public static void outAll(int n) {
Map<String, String> map = new HashMap<String, String>();
getString("", n, n, map);
for (String key : map.keySet()) {
System.out.println(key);
}
}
public static void main(String[] args) {
outAll(6);
}
}
棋盘问题:
package com.etc.icss;
import java.util.Scanner;
public class QiPan {
private int counter = 0;
private boolean hasMap = false;
private int[][] map = null;
public void chessBoard(int northWestX, int northWestY, int targetX,int targetY, int size) {
if (!hasMap) {
buildMap(size);
hasMap = true;}
if (size == 1) {return;}
size /= 2;
int sign = ++counter;
if (targetX < northWestX + size && targetY < northWestY + size) {
chessBoard(northWestX, northWestY, targetX, targetY, size);
} else {
if (map[northWestY + size - 1][northWestX + size - 1] != 0) {
System.out.println("position (" + (northWestX + size - 1) + ", "+ (northWestY + size - 1)+ ") has been filled!");}
map[northWestY + size - 1][northWestX + size - 1] = sign;
chessBoard(northWestX, northWestY, northWestX + size - 1,
northWestY + size - 1, size);}
if (targetX >= northWestX + size && targetY < northWestY + size) {
chessBoard(northWestX + size, northWestY, targetX, targetY, size);
} else {
if (map[northWestY + size - 1][northWestX + size] != 0) {
System.out.println("position (" + (northWestX + size) + ", "+ (northWestY + size - 1) + ") has been filled!");}
map[northWestY + size - 1][northWestX + size] = sign;
chessBoard(northWestX + size, northWestY, northWestX + size,northWestY + size - 1, size);}
if (targetX >= northWestX + size && targetY >= northWestY + size) {
chessBoard(northWestX + size, northWestY + size, targetX, targetY,
size);
} else {
if (map[northWestY + size][northWestX + size] != 0) {
System.out.println("position (" + (northWestX + size - 1) + ", "+ (northWestY + size - 1)+ ") has been filled!");}
map[northWestY + size][northWestX + size] = sign;
chessBoard(northWestX + size, northWestY + size, northWestX + size,northWestY + size, size);}
if (targetX < northWestX + size && targetY >= northWestY + size) {
chessBoard(northWestX, northWestY + size, targetX, targetY, size);
} else {
if (map[northWestY + size][northWestX + size - 1] != 0) {
System.out.println("position (" + (northWestX + size - 1) + ", "+ (northWestY + size - 1)+ ") has been filled!");}
map[northWestY + size][northWestX + size - 1] = sign;
chessBoard(northWestX, northWestY + size, northWestX + size - 1,northWestY + size, size);}}
循环赛日程表问题:
private void buildMap(int size) {
map = new int[size][size];
for (int y = 0; y < size; ++y) {
for (int x = 0; x < size; ++x) {
map[y][x] = 0;}}}
public void printMap() {
for (int y = 0; y < map.length; ++y) {
for (int x = 0; x < map[0].length; ++x) {
System.out.print(map[y][x] + "\t");}
System.out.println();}}
public static void main(String[] args) {
System.out.println("请输入您想要的合法大小,例如:4");
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
System.out.println("你输入的是:" + i + " * " + i+ " 的矩阵 , 默认特殊位置为(1, 2),也可以对参数作出更改!");
double flag = Math.log(i) / Math.log(2);
if ((flag - (int) flag) != 0) {
System.out.println("参数不合法!");
} else {
QiPan arithmetic = new QiPan();
arithmetic.chessBoard(0, 0, 1, 2, i);
arithmetic.printMap();
}}}
package com.etc.icss;
import java.util.Scanner;
public class RoundRobinSchedule {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入 k 的值(2^k个运动员)");
int k = scanner.nextInt();
scanner.close();
// 求运动员人数
int n = 1;
for (int i = 1; i <= k; i++) {
n = n * 2; }
// 创建二维数组作为日程表
int[][] array = new int[n + 1][n + 1];
// 制作日程表
table(k, array, n);
// 输出日程表
printTable(array, n);}
private static void table(int k, int[][] a, int n) {
// 设置日程表第一行
for (int i = 1; i <= n; i++) {
a[1][i] = i; }
// 每次填充时,起始填充位置
int m = 1;
for (int s = 1; s <= k; s++) {
n /= 2;
for (int t = 1; t <= n; t++) {
// 控制行
for (int i = m + 1; i <= 2 * m; i++) {
// 控制列
for (int j = m + 1; j <= 2 * m; j++) {
// 右下角等于左上角的值
a[i][j + (t - 1) * m * 2] = a[i - m][j + (t - 1) * m * 2 - m];
// 左下角等于右上角的值
a[i][j + (t - 1) * m * 2 - m] = a[i - m][j + (t - 1) * m * 2];
} } }
m *= 2;} }
// 输出日程表
private static void printTable(int[] array[], int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
System.out.print(array[i][j] + " ");}
System.out.println();
}}}
矩阵连乘问题
package com.etc.icss;
public class matrixChain {
//计算最优值
public void matrixChain(int[]p, int[][]m, int [][]s)
{
int n=p.length-1;
for (int i=1;i<=n;i++) m[i][i] = 0;
for (int r=2;r<=n;r++)
for(int i=1;i<=n-r+1;i++){
int j=i+r-1;
m[i][j] = 999999999;
s[i][j] = i;
for (int k = i; k < j; k++) {
int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
if (t < m[i][j]) {
m[i][j] = t;
s[i][j] = k;}
}
}
}
//构造最优解
public void TraceBack(int [][]s, int i, int j)
{
if(i!=j){
TraceBack(s,i,s[i][j]);
TraceBack(s,s[i][j]+1,j);
System.out.println("Multiply A["+i+":"+s[i][j]+"] and A["+(s[i][j]+1)+":"+j+"]");
}
}
// 打印加括号的最优解方案
public void OptimalParens(int[][] s,int i,int j){
if(i==j)System.out.print("(A"+i);
else{
OptimalParens(s,i,s[i][j]);
OptimalParens(s,s[i][j]+1,j);
System.out.print(")");
}
}
}
哈夫曼编码未编译实现
package com.etc.icss;
//矩阵阶乘的测试
public class MatrixText {
public static void main(String agrs[])
{ int[] p={30,35,15,5,10,80,25,65,40,20};
int n=p.length;
int [][]m=new int [n][n];
int [][]s=new int [n][n];
matrixChain m1=new matrixChain();
m1.matrixChain(p, m, s);
System.out.println("该矩阵阶乘子问题数乘的次数:");
for(int i=1;i<m.length;i++){
for(int j=1;j<m.length;j++){
if(i>j)
{System.out.print("----"+"\t"); }
else
{ System.out.print(m[i][j]+"\t");} }
System.out.println(); }
System.out.println();
System.out.println("该矩阵阶乘子问题数乘的次数:");
for(int i=1;i<s.length;i++){
for(int j=1;j<s.length;j++){
if(i>j)
{ System.out.print("----"+"\t");}
else{ System.out.print(s[i][j]+"\t"); } }
System.out.println(); }
System.out.println();
System.out.println("该矩阵阶乘的最优解:");
m1.TraceBack(s,1,n-1);
m1.OptimalParens(s,1,n-1);
}
}
批处理作业调度
package com.etc.icss;
public class BestSchedule2 {
int n=3;//作业数??
int[][] mission={{2,1},{3,1},{2,3}};
int bestFinishtime = Integer.MAX_VALUE;//最短时间?
int []schedule = {0,1,2};//默认的策略顺序。??
int []bestSchedule = new int[n];//最佳顺序??
int []f2 = new int[n];//第二台机器的每个任务的结束时间
int f1,totaltime;//f1当前任务的结束时间,f2的总时间
public void swap(int[] str,int m,int n){
int temp = str[m];
str[m] = str[n];
str[n] = temp;}
public void BackTrack(int t){
//当搜索到叶子节点后,将这次遍历的策略赋值到最佳策略。?
if(t>n-1){
bestFinishtime = totaltime;
for(int i=0;i<n;i++){
bestSchedule[i] = schedule[i];
return;}}
for(int i=t;i<n;i++){
f1+=mission[schedule[i]][0];
if(t==0)
f2[t]=f1+mission[schedule[i]][1];
else
f2[t]=((f2[t-1]>f1)?f2[t-1]:f1)+mission[schedule[i]][1];
totaltime +=f2[t];
//如果该作业处理完之后,总时间已经超过最优时间,就直接回溯。
if(totaltime<bestFinishtime){
swap(schedule,t,i);
BackTrack(t+1);
swap(schedule,t,i);}
f1 -= mission[schedule[i]][0];
totaltime -= f2[t];}}
public static void main(String[] args){
BestSchedule2 bs = new BestSchedule2();
bs.BackTrack(0);
System.out.println("最佳调度方案为:");
for(int i=0;i<bs.n;i++){
System.out.print(bs.bestSchedule[i]+"??");
System.out.println();
System.out.println("其完成时间为"+bs.bestFinishtime); }}}
π的计算
package com.etc.icss;
import java.util.Scanner;
public class Pai {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
double sum=0;
int a;
for(int k=1;k<=50;k++){
a=k*10000;
for(int i=1;i<=a;i+=2){
sum+=4*(1.0/(2*i-1)-1.0/(2*i+1));
}
System.out.println("结果是"+sum);
sum=0;
}
}
}