public static void Main()
int [] weight = new int[] {1,2,4,5};
int [] values = new int[] {5,3,2,7};
int result = KnapSack(weight, values, 10, 3);
Console.Write("{0} ",dp[i,j]);
Console.WriteLine(result);
public static int KanpSackTable(int[] weight, int[] values, int bagWeight, int size){
int[,] dp = new int[bagWeight+1, size+1];
for(int i=0;i<bagWeight+1;i++){
for(int j=0;j<size+1;j++){
for(int i=1;i<bagWeight+1;i++){
for(int j=1;j<size+1;j++){
if(bagWeight >= dp[bagWeight-weight[i], j-1])
dp[i, j] = Math.Max(values[j] + dp[bagWeight-weight[i], j-1], dp[weight[i], j-1]);
dp[i, j] = dp[weight[i], j-1];
return dp[bagWeight, size];
public static int KnapSack(int[] weight, int[] values, int bagWeight, int size){
if(size < 0 || bagWeight <= 0)
if(dp[bagWeight, size] != -1) return dp[bagWeight, size];
if(bagWeight >= weight[size])
dp[bagWeight, size] = Math.Max(values[size] + KnapSack(weight, values, bagWeight-weight[size], size-1)
,KnapSack(weight, values, bagWeight, size-1));
dp[bagWeight, size] = KnapSack(weight, values, bagWeight, size-1);
return dp[bagWeight, size];