| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:求大牛们的DFS剪枝?In Reply To:求大牛们的DFS剪枝? Posted by:wskiwwwx at 2009-09-01 20:42:23 > 我的DFS有几个数过不了,求大牛们帮我看下,怎么剪枝才不会超时?
> 附带码:
> package poj2248;
>
> import java.util.Scanner;
>
> public class Main {
>
> private static int num;
> private static int[] ans = new int[101];
> private static int minLen = 0;
> private static int[] minAns = new int[101];
> private static int[] visted = new int[101];
>
> public static void main(String[] args) {
>
> Scanner sc = new Scanner(System.in);
> while (sc.hasNextInt()) {
> num = sc.nextInt();
> if (num == 0)
> break;
>
> if (num == 71) {
> System.out.println("1 2 3 4 7 8 16 32 39 71");
> } else if (num == 79) {
> System.out.println("1 2 3 4 7 9 18 36 43 79");
> } else if (num == 87) {
> System.out.println("1 2 3 4 7 10 20 40 47 87");
> } else if (num == 89) {
> System.out.println("1 2 3 4 7 11 22 44 45 89");
> } else if (num == 91) {
> System.out.println("1 2 3 4 7 11 22 44 47 91");
> } else if (num == 93) {
> System.out.println("1 2 3 4 7 14 17 31 62 93");
> } else if (num == 94) {
> System.out.println("1 2 3 4 7 10 20 27 47 94");
> } else if (num == 95) {
> System.out.println("1 2 3 4 7 11 22 44 51 95");
> } else {
> minLen = 0;
> ans[1] = 1;
> dfs(2);
> for (int i = 1; i <= minLen; i++) {
> System.out.print(minAns[i] + " ");
> }
> System.out.println();
> }
> }
> }
>
> private static void dfs(int pos) {
>
> if (ans[pos - 1] == num) {
> if (minLen == 0) {
> minLen = pos - 1;
> System.arraycopy(ans, 1, minAns, 1, pos - 1);
> } else {
> if (minLen > pos - 1) {
> System.arraycopy(ans, 1, minAns, 1, pos - 1);
> // for(int i = 1 ; i <= pos-1 ;i++){
> // minAns[i] = ans[i];
> // }
> minLen = pos - 1;
> }
> }
> return;
> }
>
> int i = 1;
> for (i = 1; i < pos; i++) {
> if (minLen != 0 && pos >= minLen) {
> break;
> }
> for (int j = 1; j < pos; j++) {
> int temp = ans[pos - i] + ans[pos - j];
> if (ans[pos - 1] < temp && temp <= num && visted[temp] == 0) {
> visted[temp] = 1;
> ans[pos] = temp;
> pos++;
> dfs(pos);
> pos--;
> visted[ans[pos]] = 0;
> }
> }
> }
> }
>
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator