【发布时间】:2015-12-04 07:10:52
【问题描述】:
我正在用 Java 做一个背包,我们只使用权重没有价值。 weightlimit 是 1000。我们从使用的键盘扫描了 5 个权重。 扭曲的是,只要壁橱达到 1000,您实际上可以超过 1000。因此,在一种情况下,我们有 2 个可能的权重 990 和 1010,并且程序应该选择较高的一个。 扫描的数字永远不会高于 1000。
package kapsackidone;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.*;
public class Kapsack {
public static void main(String[] args) throws Exception {
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
int [] wt=new int[5];
int W = 1000;
System.out.println("Enter Weight 5 weights");
for(int i=0; i<5; i++)
{
wt[i]=Integer.parseInt(reader.readLine());
}
System.out.println(knapsack(wt, W));
}
public static int knapsack(int wt[], int W) {
int N = wt.length;
int[][] V = new int[N + 1][W + 1];
for (int col = 0; col <= W; col++) {
V[0][col] = 0;
}
for (int row = 0; row <= N; row++) {
V[row][0] = 0;
}
for (int item=1;item<=N;item++){
for (int weight=1;weight<=W;weight++){
if(wt[item-1] > weight)
{
V[item][weight] = V[item-1][weight];
}
else if((weight - V[item-1][weight]) < (weight - (V[item-1][weight - wt[item-1]] + wt[item-1])))
{
V[item][weight] = V[item-1][weight];
}
else
{
V[item][weight] = V[item-1][weight - wt[item-1]] + wt[item-1];
}
}
}
return V[N][W];
}
}
我真的在为如何完成这项工作而苦苦挣扎。 在你问不之前,这不是家庭作业,我将成为一个由开发人员组成的新团队的项目经理,所以我只是想学习一些 Java,以便我了解他们所做的一些事情,即使我怀疑我能否做到帮助编码。
【问题讨论】:
-
问题是第二小的权重(不可行解的最小可能值)可以任意大。考虑两个项目
i1=1和i2=M,其中M是一个非负整数;假设背包容量为1。唯一可行的解决方案是i1,权重为1,而最小的不可行解决方案是i2,其值为M。当M趋于无穷大时,M-1(到最优值的附加距离)和M/1(最优值与最小可能违反容量的比率)都不是有界的。 -
所以这是我在 kattis 网上找到的任务。我们想举起尽可能接近 1000 公斤。如果存在两个同样接近 1000 的数字(例如 998 和 1002),我们将选择较大的一个(在本例中为 1002)。输入 输入的第一行包含板数 n (1≤n≤1000)。以下 n 行中的每一行包含一个小于或等于 1000 的正整数,表示每个盘子的重量。输出 输出一个整数,组合权重最接近 1000。
-
我忘了说重量是恒定的 1000 并且扫描的数字永远不会超过 1000 他们只能是 500 和 700 等于总和 1200 但一个单一的重量永远不会超过1000
标签: java knapsack-problem