给定问题:
0/1-背包问题,n个项目的权值为w_i和v_i。求权重加起来为权重W的项目的最大总价值。
但有两个难题:
我想找到一个算法,同时关注这两个问题。我已经发现了如何一次性关注其中一个。
public class KnapSackExactWeight {
public static void main(String[] args) {
int[] w = new int[] {4, 1, 5, 8, 3, 9, 2}; //weights
int[] v = new int[] {2, 12, 8, 9, 3, 4, 3}; //values
int n = w.length;
int W = 10; // W (max weight)
int[][] DP = new int[n+1][W+1];
for(int i = 1; i < n+1; i++) {
for(int j = 0; j < W+1; j++) {
if(i == 0 || j == 0) {
DP[i][j] = 0;
} else if (j - w[i-1] >= 0) {
DP[i][j] = Math.max(DP[i-1][j], DP[i-1][j - w[i-1]] + v[i-1]);
} else {
DP[i][j] = -Integer.MAX_VALUE;
}
}
}
System.out.println("Result: " + DP[n][W]);
}
}
Result: 22
public class KnapSackEvenAmount {
public static void main(String[] args) {
int[] weights = new int[] {4, 1, 5, 8, 3, 9, 2}; //weights
int[] values = new int[] {2, 12, 8, 9, 3, 4, 3}; //values
int n = weights.length;
int W = 10;
int[][] DP_odd = new int[n+1][W+1];
int[][] DP_even = new int[n+1][W+1];
for(int i = 0; i < n+1; i++) {
for(int j = 0; j < W+1; j++) {
DP_even[i][j] = -1;
DP_odd[i][j] = -1;
if(i == 0 || j == 0) {
DP_odd[i][j] = -1;
DP_even[i][j] = 0;
} else if(j - weights[i-1] >= 0) {
if(DP_odd[i-1][j - weights[i-1]] >= 0) {
DP_even[i][j] = Math.max(DP_even[i-1][j], DP_odd[i-1][j - weights[i-1]] + values[i-1]);
}
if(DP_even[i-1][j - weights[i-1]] >= 0) {
DP_odd[i][j] = Math.max(DP_odd[i-1][j], DP_even[i-1][j - weights[i-1]] + values[i-1]);
}
}
if(i > 0) {
DP_odd[i][j] = Math.max(DP_odd[i][j], DP_odd[i-1][j]);
DP_even[i][j] = Math.max(DP_even[i][j], DP_even[i-1][j]);
}
}
}
System.out.println("Result: " + DP_even[n][W]);
}
}
Result: 21
现在我的问题是如何实现这两个难题一起工作。有办法解决这个吗?
(如果我的问题有什么不清楚的地方,尽管问!)
我不确定这是否是解决这个问题的最佳方法,但我在这里所做的是最初减少问题以适应约束条件。首先找出与背包重量相等的物品的可能偶数,然后找出最大值的组合
import java.util.Scanner;
import static java.lang.Math.pow;
public class subSet{
void subset(int num,int n, int x[])
{
int i;
for(i=1;i<=n;i++)
x[i]=0;
for(i=n;num!=0;i--)
{
x[i]=num%2;
num=num/2;
}
}
public static void main(String[] args) {
int n,d,sum,present=0;
int j;
System.out.println("enter the number of items");
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
int a[]=new int[n+1];
int x[]=new int[n+1];
System.out.println("enter the weights of items");
for(int i=1;i<=n;i++)
a[i]=sc.nextInt();
System.out.println("enter the values of items");
int v[]=new int[n+1];
for(int i=1;i<=n;i++)
v[i]=sc.nextInt();
System.out.println("enter the max weight");
d=sc.nextInt();
int sol=0;int max=0;
if(d>0)
{
for(int i=1;i<=Math.pow(2,n)-1;i++)
{
subSet s=new subSet();
s.subset(i,n,x);
sum=0;int count=0;
for(j=1;j<=n;j++)
if(x[j]==1)
{
sum=sum+a[j];
count++;
}
sol=0;
if(d==sum && count%2==0)
{
present=1;
for(j=1;j<=n;j++)
{
if(x[j]==1)
sol=v[j]+sol;
if(sol>max)
max=sol;
}
}
}
}
if(present==0)
System.out.println("Solution does not exists");
else
System.out.print("solution = "+max);
}
}
问题内容: 我想运行一个elasticsearch查询,该查询按两个不同字段(纬度和经度)的组合对数据进行分组 它提供的结果比预期的要多一倍…知道吗? 答案的更多相关部分是… 如果我不应用这些方面,则总点击数是37。该总数是构面总数的一半(请参见下文) 因此,构面分组是分别进行的(按纬度然后按经度)。 请注意,我不能仅按纬度或经度分组,因为多个记录可以共享纬度(但具有不同的经度),反之亦然。 问题
像 Blackbox 一样,Fluxbox 为此也提供了两套 wrapper 工具--bsetroot 和 fbsetbg 。 我们一道来看看它们是如何工作的。 bsetroot几乎具备了xsetroot的所有功能。 只要是简单的背景它都可以设置, 例如单色的。另外,bsetroot 也可以设置渐变色的背景。 fbsetbg之所以称为 wrapper,在于它尝试着去寻找 一个适合的背景设置程序,从
问题内容: 我正在尝试运行此方法,以将通用值(EltType)插入到双面队列(双端队列)中,但是我一直收到无法确定的outOfBoundsException。有人能帮我这个忙吗?这只是代码的一部分,但我认为可以将其拼凑起来! 错误: 问题答案: 应该变成 您使用了“小于或等于”,但是数组的最后一项的索引为(length-1)。
我正在使用以下代码更改JTable中一行的背景色。对于所有具有字符串值的单元格,行的颜色都会更改,但是对于具有整数值或双数值的单元格,行的颜色不会更改。
本文向大家介绍google-chrome-extension 背景页面,包括了google-chrome-extension 背景页面的使用技巧和注意事项,需要的朋友参考一下 示例 后台页面是包含后台脚本的隐式页面。后台脚本是一个长期运行的脚本,用于管理某些任务或状态。它在扩展程序的整个生命周期中都存在,并且一次只有一个实例处于活动状态。 您可以在您的中这样声明它manifest.json: 扩展
如何应用背压来限制生产比并行运行的更多的项目? 为了说明起见,这里有一个快速twitter用户名生成器、一个慢速twitter查找调用、一个慢速twitter文件编写器和一个打印方法。 最终目标是并行运行twitter查找,同时对生成器施加反压力,使其不会发出超出可处理范围的用户名(预计会有一些预取)。 这很好地在一个单独的线程上生成了5个twitter用户名 不确定它是正确的,但我的理由是,从一