/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
int val[] = {60, 100, 120};
int wt[] = {10, 20, 30};
int W = 50;
solution(val,wt,W);
}
public static void solution(int[] val,int[] wt,int W)
{
System.
out.
println("Recursive naive approach = "+Naive_recursive
(val,wt,W,
0)); System.
out.
println("DP bottom Up = "+dp_bottomUp
(W,wt,val
)); }
// want to maximize the subset value of val for W=0
public static int Naive_recursive(int[] val,int[] wt,int W,int i)
{
// variable i indicate particular value to be included or not
if(W==0 || i>wt.length-1)
{
return 0;
}
if(wt[i]>W)
return Naive_recursive(val,wt,W,i+1);
else
return Math.
max(val
[i
]+Naive_recursive
(val,wt,W
-wt
[i
],i
+1),Naive_recursive
(val,wt,W,i
+1));
}
public static int dp_bottomUp(int W, int wt[], int val[])
{
// table formation
// System.out.println("len = "+(val.length+1));
int[][] t=new int[val.length+1][W+1];
int i,j;
for(i=0;i<=val.length;i++)
t[i][0]=0;
for(j=0;j<=W;j++)
t[0][j]=0;
for(i=1;i<=val.length;i++)
{
for(j=1;j<=W;j++)
{
//System.out.println("i= "+i+" j= "+j);
if(wt[i-1]<=j)
{
t
[i
][j
]=Math.
max(val
[i
-1]+t
[i
-1][j
-wt
[i
-1]],t
[i
-1][j
]); }
else
{
t[i][j]=t[i-1][j];
}
}
}
return t[--i][--j];
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCSAgICBpbnQgdmFsW10gPSB7NjAsIDEwMCwgMTIwfTsKICAgIGludCB3dFtdID0gezEwLCAyMCwgMzB9OwogICAgaW50ICBXID0gNTA7CiAgICAgICAgCiAgICAgICAgc29sdXRpb24odmFsLHd0LFcpOwoJfQoJcHVibGljIHN0YXRpYyB2b2lkIHNvbHV0aW9uKGludFtdIHZhbCxpbnRbXSB3dCxpbnQgVykKICAgICB7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY3Vyc2l2ZSBuYWl2ZSBhcHByb2FjaCA9ICIrTmFpdmVfcmVjdXJzaXZlKHZhbCx3dCxXLDApKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRFAgYm90dG9tIFVwID0gIitkcF9ib3R0b21VcChXLHd0LHZhbCkpOwogICAgIH0KCiAgICAgIAogICAgIC8vIHdhbnQgdG8gbWF4aW1pemUgdGhlIHN1YnNldCB2YWx1ZSBvZiB2YWwgZm9yIFc9MAogICAgIHB1YmxpYyBzdGF0aWMgaW50IE5haXZlX3JlY3Vyc2l2ZShpbnRbXSB2YWwsaW50W10gd3QsaW50IFcsaW50IGkpCiAgICAgewogICAgICAgICAvLyB2YXJpYWJsZSBpIGluZGljYXRlIHBhcnRpY3VsYXIgdmFsdWUgdG8gYmUgaW5jbHVkZWQgb3Igbm90CiAgICAgICAgIGlmKFc9PTAgfHwgaT53dC5sZW5ndGgtMSkgCiAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9ICAgICAgICAgCiAgICAgICAgIAogICAgICBpZih3dFtpXT5XKSAgIAogICAgICAgICAgcmV0dXJuIE5haXZlX3JlY3Vyc2l2ZSh2YWwsd3QsVyxpKzEpOwogICAgICBlbHNlICAgCiAgICAgcmV0dXJuIE1hdGgubWF4KHZhbFtpXStOYWl2ZV9yZWN1cnNpdmUodmFsLHd0LFctd3RbaV0saSsxKSxOYWl2ZV9yZWN1cnNpdmUodmFsLHd0LFcsaSsxKSk7CiAgICAgCiAgICAgfQoKCiAgICBwdWJsaWMgc3RhdGljIGludCBkcF9ib3R0b21VcChpbnQgVywgaW50IHd0W10sIGludCB2YWxbXSkKICAgIHsKICAgICAgICAvLyB0YWJsZSBmb3JtYXRpb24KICAgICAgLy8gIFN5c3RlbS5vdXQucHJpbnRsbigibGVuID0gIisodmFsLmxlbmd0aCsxKSk7CiAgICAgICAgCiAgICAgICAgaW50W11bXSB0PW5ldyBpbnRbdmFsLmxlbmd0aCsxXVtXKzFdOwogICAgICAgIGludCBpLGo7CiAgICAgICAgCiAgICAgICAgZm9yKGk9MDtpPD12YWwubGVuZ3RoO2krKykKICAgICAgICAgICAgdFtpXVswXT0wOwogICAgICAgIAogICAgICAgIGZvcihqPTA7ajw9VztqKyspCiAgICAgICAgICAgIHRbMF1bal09MDsKICAgICAgICAKICAgICAgICBmb3IoaT0xO2k8PXZhbC5sZW5ndGg7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yKGo9MTtqPD1XO2orKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImk9ICIraSsiIGo9ICIraik7CiAgICAgICAgICAgICAgICAgICAgaWYod3RbaS0xXTw9aikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRbaV1bal09TWF0aC5tYXgodmFsW2ktMV0rdFtpLTFdW2otd3RbaS0xXV0sdFtpLTFdW2pdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdFtpXVtqXT10W2ktMV1bal07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiB0Wy0taV1bLS1qXTsKICAgICAgICAKICAgIH0KfQ==