如何解决价值最小的背包问题?

时间:2019-04-03 15:41:36

标签: java algorithm dynamic dynamic-programming knapsack-problem

我收到一份包含其卡路里和脂肪值信息的膳食文件->

330350100230 //这是卡路里 30 27 10 10 //这很胖

用户还可以输入“所需卡路里”量。

我的任务是使用动态编程来创建一种算法,该算法输出卡路里的数量和用于达到卡路里的食物的清单。每顿饭只能使用一次,脂肪必须最小化,我的卡路里输出必须尽可能接近我输入的“想要的卡路里”量...

我认为这与背包问题非常相似,我的“需要的卡路里”是袋子的容量,卡路里是每件物品的重量,脂肪是每件物品的价值。

据我所知,这个问题与通常需要将值最大化的背包问题不同,在这种情况下,需要将其值最小化。

private int minimumFat(int wantedCalories,int []卡路里,int []脂肪){

    int n = fat.length;

    int min_fat[][] = new int[n+1][wantedCalories+1];

    // Fill 0th Row with infinity
    for (int i=0; i <= wantedCalories; i++) {
        min_fat[0][i] = Integer.MAX_VALUE;
    }

    // Fill 0th Column with 0
    for (int i=1; i<=n; i++) {
        min_fat[i][0] = 0;
    }

    // Check each weight one by one
    for (int i=1; i<=n; i++) {
        System.out.println(i + ")");
        for (int j=1; j<=wantedCalories; j++) {
            if (calories[i-1] > j) {
                min_fat[i][j] = min_fat[i-1][j];
            } else {
                min_fat[i][j] = Math.min(min_fat[i-1][j], min_fat[i][j-calories[i-1]] + fat[i-1]);
            }
            System.out.print(min_fat[i-1][j-1] + " ");
        }
    }

    return min_fat[n][wantedCalories];
}

运行上面的代码时,我的结果为负,据我所知发生是因为Integer.MAX_VALUE溢出。我不确定应该如何从这里继续,因为无论我在Math.min中放入什么内容,它都将始终支持min_fat [i-1] [j]。我希望输出的结果是膳食计划中消耗的脂肪,这样我便可以追溯并找到所使用的卡路里总量以及制定膳食计划的项目,但这显然没有发生。

0 个答案:

没有答案