Java dp[!t][val]用于从数组中跳过部件
考虑cpp中的以下代码段。这是取自动态规划教程 它主要用于空间优化背包问题Java dp[!t][val]用于从数组中跳过部件,java,c++,dynamic-programming,knapsack-problem,Java,C++,Dynamic Programming,Knapsack Problem,考虑cpp中的以下代码段。这是取自动态规划教程 它主要用于空间优化背包问题 for(int i=1;i<=a;i++) { int t = a%2; for(int j=0;j<1100000;j++) dp[t][j] = inf; for(int j=0;j<1100000;j++){ dp[t][j] = min(dp[t][j],dp[!t][j-v[i-1]]+w[i-1]);//!t part is for skipping
for(int i=1;i<=a;i++)
{
int t = a%2;
for(int j=0;j<1100000;j++) dp[t][j] = inf;
for(int j=0;j<1100000;j++){
dp[t][j] = min(dp[t][j],dp[!t][j-v[i-1]]+w[i-1]);//!t part is for skipping the current
}
}
for(inti=1;i只需将!t
替换为t^1
或1-t
(只要你觉得更可读,效果都一样)。这就是你需要做的一切
解释
Java支持此代码段中显示的所有整数操作:
int t=a%2;
只需将!t
替换为t^1
或1-t
(只要你觉得更可读,效果都一样)。这就是你需要做的一切
解释
Java支持此代码段中显示的所有整数操作:
int t=a%2;
dp[!t]
没有跳过特定的元素。如果t
是0
,那么dp[!t]
是dp[1]
,否则它是dp[0]
。唯一有意义的方法(假设dp
是一个数组,而不是一些课时)是dp
是t[2]
array。然后,由于t
在这里总是0或1,dp[t]
是这两行中的一行,而dp[!t]
是另一行。1-t有什么问题吗?如果你想要按位求反,你可以使用~
1-t给出arrayindexoutofbounds异常你可以检查自己dp[!t]
不是跳过特定的元素。如果t
是0
,那么dp[!t]
是dp[1]
,否则它是dp[0]
。唯一有意义的方法(假设dp
是一个数组而不是某个类时间)是dp
是t[2]
array。然后,由于t
在这里总是0或1,dp[t]
是这些行中的一行,并且dp[!t]
是另一个。1-t有什么问题吗?如果你想要按位求反,你可以使用~
1-t提供ArrayIndexOutOfBoundsException你可以自己检查谢谢你的回答。但是我特别问了!t部分。我在!t中尝试了t^1和1-t。但是它不起作用。它给我ArrayIndexOutOfBoundsException,因为它小于0@AashishPawar和我在这个答案中解释了这一部分。如果你遇到了这个错误,要么你粘贴的代码不是你正在运行的代码,要么a是否定的,在这种情况下(正如我在回答中所说的),t将是-1。C代码在那里也没有多大意义。在这种情况下,它可能充当't==0?1:0'。谢谢你的回答。但我特别询问了!t部分。我在!t中尝试了t^1和1-t。但它不起作用。它给我ArrayIndexOutOfBoundsException,因为它小于0@AashishPawar我在这篇文章中解释了这一部分回答。如果你遇到了这个错误,要么你粘贴的代码不是你正在运行的代码,要么a是负数,在这种情况下(正如我在回答中所说的),t将是-1。C代码在这里也没有太多意义。在这种情况下,它可能充当't==0?1:0'。