回溯法

 24点问题

问题描述:给定4个正整数,用算术运算符 + - * / 将这4个正整数连接起来,是最终的得数恰为24点。
   
数据输入:由文件input.txt给出输入数据,第一行有4个正整数。
   
结果输出:将计算24的算术表达式输出到文件output.txt。如果有多个满足要求的表达式,只要输出一组,每一步算式用分号隔开。如果无法得到24则输出“No Solution
   
输入文件示例:1 2 3 7
   
输出文件示例:2+1=37*3=2121+3=24

分析:对输入的4个数a,b,c,d与运算符+,-,*,/的所有组合用回溯法进行搜索。

 

算法实现Java代码:

public class Count24 { public boolean found; public float[][] r = new float[6][6]; public void search(int k,float[] d){ int i,j,m,t; float a,b; float[] e = new float[5]; if(k==1){ if((int)((d[1]-24)*10000)==0){ outanswer(); found=true; } }else{ for(i=1;i<=k-1;i++) for(j=i+1;j<=k;j++){ a=d[i]; b=d[j]; if(a

 

 

 

0-1背包问题

问题描述:给定n种物品和一个背包。物品i的重量是wi,其价值是vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i

分析:用搜索子集数的一般算法解决。

 

class Goods{ public int ID; public float d; } public class Knap { int c; //背包容量 int n; //物品数 int[] w; //物品重量数组 int[] p; //物品价值数组 int cw; //当前重量 int cp; //当前价值 int bestp; //当前最优值 int[] bestx; //当前最优解 int[] x; //当前解 public void print(){ for(int m=1;m<=n;m++){ System.out.println(bestx[m]); } } //上界函数 int Bound(int i){ //计算上界 int cleft = c-cw; //剩余容量 int b = cp; //以物品单位重量价值递减序装入物品 while(i<=n&&w[i]<=cleft){ cleft -= w[i]; b += p[i]; i++; } //装满背包 if(i<=n) b += p[i]/w[i]*cleft; return b; } //回溯 void Backtrack(int i){ if(i>n){ if(bestpbestp){ //搜索右子树 x[i]=0; Backtrack(i+1); } } //为Backtrack初始化 public int Knapsack(int price[],int weight[],int cap,int num){ int W=0; int P=0; int i=1; this.n = num; Goods[] Q = new Goods[num]; for(i=0;i

你可能感兴趣的:(算法思考)