#define max(a, b) ((a) > (b) ? (a) : (b)) int knapsack(int V, int n, int** vw, int vwRowLen, int* vwColLen ) { int dp[V + 1];//定义一个数组有V+1个元素,值为从0到V,表示当体积为这些数时,相应可容纳的重量 int vi, mi; //定义某个物品的体积为vi,重量为mi for (int i = 0; i <= V; i++) { dp[i] = 0; //先将数组值全部初始化为0 } for (int i = 1; i <= n; i++) //物品从第1个开始,到第n个,但数组下标是从0到n-1 { //vw数组第一个维度表示第几个物品,第二个维度只有0和1,为0表示体积,为1表示重量 vi = vw[i - 1][0];//记录第i个物品的体积 mi = vw[i - 1][1]; //记录第i个物品的重量 for (int j = V; j >= vi; j--) //j若小于某物品的重量vi,则一个物品都装不了 { dp[j] = max(dp[j - vi] + mi, dp[j]); //dp[j - vi] 表示背包装了某物品之后还可承载物品的总重量 //dp[j - vi] + mi 表示装了某物品的背包总共可承载的重量 //dp[j] 表示可容纳体积为j的背包总共可承载的重量 //max这句的意思就是比较装与不装某个物品,哪种情况可承载的物品更重 } } return dp[V]; }