【问题标题】:Dynamic Prog Help (knapsack)动态程序帮助(背包)
【发布时间】:2015-05-29 06:54:33
【问题描述】:

我正在研究这个动态编程问题,我一直坚持用 Java 编写迭代解决方案

我们的目标是找出消耗 X 美分所需的最少卡路里数。如果我们不能准确花费 X 美分,那么就没有解决方案。我们有 N 个项目,每个项目都有价值 V 和卡路里 C。

public static void iterative(int[] v, int[] c, String[] items, int X, int num_items)
{
    System.out.println("Iterative");

    int N = num_items;
    int[] min = new int[X];


    int i, j;
    for(i=1 i < X; i++) {
        min[i] = Integer.MAX_VALUE;
    }

    min[0] = 0;
    for(i=1;i<=X;i++)
    {
        for(j=0;j<N;j++)
        {
            if(v[j]<=i && ((min[i-v[j]]+c[i]) < min[i])) //Wrong?
            {
                min[i] = min[i-v[j]] + 1;
            }
        }
    }
}

我想我只是没有真正理解迭代步骤的递归关系。

【问题讨论】:

标签: java dynamic-programming knapsack-problem


【解决方案1】:

重复关系将是相同的,无论您是自上而下还是自下而上编程都没有关系。由于您查看了http://en.wikipedia.org/wiki/Knapsack_problem,因此递归关系将保持不变。唯一的变化是,通常在背包问题中,您被赋予了一个限制(重量限制),并且您应该在该限制中最大化该值。但既然你想花 X 美分,你需要专门检查一下。我知道这是 java 语言特定的问题,但我写了一个 C++ 代码。 Java 转换应该非常简单,希望对您有所帮助。

#define INTMAX 1000000
int solve(int *v,int *c,int X,int n){
    int **result= new int * [n];
    for(int i=0;i<n;i++){
        result[i]=new int[X+1];
    }
    //initialization with the first object. INTMAX shows it's not possible to find items in exactly X cents.
    for(int i=1;i<=X;i++){
        if(v[0]==i)
            result[0][i]=c[0];
        else
            result[0][i]=INTMAX;
    }
    for(int i=1;i<n;i++){
        for(int j=1;j<=X;j++){
            // either you can choose ith object or leave it. Check explicitly for the case when you can't select items with X cents.
            result[i][j]=min((j>=v[i])?(c[i]+result[i-1][j-v[i]]):INTMAX, result[i-1][j]);
            cout<<"i:"<<i<<"\tj:"<<j<<"\tresult:"<<result[i][j]<<"\n";
        }
    }
    return result[n-1][X]==INTMAX?-1:result[n-1][X];
}  

如果不可能正好花费 X 美分,则返回 -1。让我知道您是否需要更多的信息来理解。虽然我建议对背包问题使用自上而下的方法,因为您不需要计算任何单个问题的所有子问题。

【讨论】:

  • 谢谢@Naman 我不太懂C,但我尽我所能把它放在一起。
  • @Leroy 没问题,我很久没有使用 Java 了,否则我肯定会把它放在 Java 中。但我想这个概念应该很清楚。如果没有,请告诉我,我很乐意提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多