function Knapsack( n, w,  v,x, C){//数组是当做指针传递的
    var i,j;//F[i][j] 前i个物品装入容量为j的背包中获得的最大价值
  
    for(i=0;i<=n;i++) {
        for(j=0;j<=C;j++) {
            F[i][j]=MIN;
        }
    }                //初始化为0
    ////////////////关键代码//////////////////////
    for(i=1;i<=n;i++) {
        for(j=w[i];j<=C;j++)//这里j是从w[i]开始，背包容量小于第i件物品重量，则状态转换方程中下标出现负值，无意义
        {
            F[i][j]=Math.max(F[i-1][j],F[i-1][j-w[i]]+v[i]);//建立背包表
        // cout<<"F["<<i<<"]["<<j<<"]="<<F[i][j]<<endl;
        }
    }
    //////////////////////////////////////////// 
  
    j=C;//确定背包容量
  
    for(i=n;i>0;i--) {//已知背包容量，不断减去最大的物品重量来确定背包中装的物品
        if(F[i][j]>F[i-1][j])//如果将前i个物品装进去比将前i-1个物品装进去总价值大，说明总价值最大的背包中有第i个物品。
        {
            x[i]=1;
            j=j-w[i];//不用担心结果小于零，因为在上面的二重循环中已经处理过了
        } else {
            x[i]=0;
        }   
    }
  
    // cout<<"选中的物品是:"<<endl;
  
    for(i=1;i<=n;i++)
    // cout<<x[i]<<endl;
  
    /*也可以这样输出背包中的物品
    while(i)
    {
   if(F[i][j]==(F[i-1][j-w[i]]+v[i]))//逐个输出每个物品
   {
   cout<<i<<":"<<"v="<<v[i]<<",w="<<w[i]<<endl;
   j-=w[i];
   }
   i--;
    }  
  */
  
    {
        return F[n][C];
    }
      
}