日期:2014-05-20  浏览次数:20735 次

贪心算法解决0-1背包问题,hdu1009 为甚WA??
url:http://acm.hdu.edu.cn/showproblem.php?pid=1009
Java code

import java.util.Scanner;
import java.util.Arrays;
import java.text.DecimalFormat;
class Obj implements Comparable
{
    int javabean;
    int cat;
    double scale;
  public int compareTo(Object o)
    {
        if(scale>((Obj)o).scale)
            return -1;
        else if(scale<((Obj)o).scale)
          return 1;
        else
           return 0;
    }
    public  boolean equals(Object o)
    {
        boolean f = false;
        if(o instanceof Obj)
        {
            if(scale==((Obj)o).scale)
             f = true;
        }
        return f;
    }
    public String toString()
    {
        String s;
        s = "scale is"+scale;
        return s;
    }
}
class tanxin
{
public static void main(String args[])
{
    Obj obj[] = new Obj[1001];
    for(int i=0;i<1001;i++)
    {
        obj[i] = new Obj();
    }
    Scanner keyIn = new Scanner(System.in);
    int javabean;
    int cat;
    int M,N;
    while(keyIn.hasNextInt())
    {
        M= keyIn.nextInt();
        N= keyIn.nextInt();
        if(M==-1&&N==-1)
           break;
        for(int i=0;i<N;i++)
        {
        obj[i].javabean= keyIn.nextInt();
        obj[i].cat = keyIn.nextInt();
      obj[i].scale = (obj[i].javabean*1.0)/obj[i].cat;
        }
        Arrays.sort(obj);
        /*System.out.println(obj[0]);
        System.out.println(obj[1]);
        System.out.println(obj[2]);*/
        double sum = 0;
        double catsum = 0;
        for(int i =0;i<N;i++)
        {
            if(obj[i].cat<=M-catsum)
              {
                  sum+=obj[i].javabean;
                  catsum+=obj[i].cat;
                  //System.out.println(obj[i].javabean);
              }
          else
          {
              if(obj[i].cat!=0)
              {
              double s= ((M-catsum)*1.0)/obj[i].cat;
          //    catsum+=obj[i].cat;
              sum=sum+s*obj[i].javabean;
              break;
            }
            else
            {
                sum=sum +obj[i].javabean;
                continue;
            }
              //System.out.println(obj[i].javabean*s);
              
          }      
        }    
    /*NumberFormat nf = NumberFormat.getNumberInstance();
    nf.setMinimumFractionDigits(3);
    nf.setMinimumFractionDigits(3);
    String str = nf.format(sum);
    System.out.println(str);*/
    
    DecimalFormat df = new DecimalFormat();
    String style="######0.000";
    df.applyPattern(style);
    String str = df.format(sum);
    System.out.println(str);
    }
}    

}



我觉得我的代码应该没什么错了啊?为什么老是WA呢?求达人指教一下啊--

------解决方案--------------------
难道不要求类名为Main吗?
------解决方案--------------------
一般要么是边界没有考虑周全
------解决方案--------------------
Java code
package com.cn.dynamic;

public class Bag {
    public static void main(String[] args) {
        int[] w = new int[]{1, 2, 5, 6, 7};
        int[] v = new int[]{1, 6, 18, 22, 28};
        int r = 11;
        knapsack(w,v, r);
    }

    private static void knapsack(int[] w, int[] v, int r) {
        int[][] s = new int[w.length + 1][r + 1];
        for (int i = 0; i < r + 1; i++) {
            s[0][i] = 0;
        }
        for (int i = 1; i < w.length + 1; i++) {
            s[i][0] = 0;
        }
        //c[i, j] = max(c[i –1, j], c[i –1, j – wi] + vi)
        for (int j = 1; j <= w.length; j++) {
            for (int i = 1; i <= r; i++) {
                 if (w[j - 1] <= i) {
                     System.out.println(i + "|" + j);
                     if (s[j - 1][i] > s[j - 1][i - w[j - 1]] + v[j - 1]) {
                         s[j][i] = s[j - 1][i];
                     } else {
                         s[j][i] = s[j - 1][i - w[j - 1]] + v[j - 1];
                     }            
                 } else {//确定放不下了,那最大值就是s[j - 1][i]
                     s[j][i] = s[j - 1][i];
                 }        
             }            
         }
        int j = 0;
         for (int i = 0; i < s.length;) {
             
             try {
                 System.out.print(s[i][j] + "  ");
                 j++;
             }catch(ArrayIndexOutOfBoundsException e) {
                 i++;
                 j=0;
                 System.out.println();
             }
         }
    }
}