class Solution { public: vector<int> knapsack(int v, int n, vector<vector<int> >& nums) { //v背包体积, n是多少种物品, 物品体积和价值 //采用动态规划,体积从0到V更新,前i种物品最大价值是多少(能否满足), vector<int> res; vector<vector<int>> dp( n+1, vector<int>(v+1, 0) ); for(int i=1; i <= n; i++){ for(int j=0; j<=v ;++j){ dp[i][j] = dp[i-1][j]; //先初始化其不使用此物品的价值情况,因为可能此物品放不下,但是也是有价值的; //当背包容量可以放下此物品时, if(j >= nums[i-1][0]) dp[i][j] = max( dp[i][j], dp[i][j-nums[i-1][0]]+nums[i-1][1] ); } } res.push_back(dp[n][v]); dp = vector<vector<int>>(n+1, vector<int>(v+1, -1));//大于等于0都表示可以装满,所以用-1表示装不满 //应该进行重新赋值,使用resize的话,原来的数不会改变,只有在增加容量的时候新的空间赋值成新数;可以使用assign(); //dp.resize(n+1, vector<int>(v+1, -1)); //-1表示默认是不能组装 dp[0][0] = 0; for(int i=1; i<=n; ++i){ int vi = nums[i-1][0], wi = nums[i-1][1]; for(int j=0; j<=v; ++j){ dp[i][j] = dp[i-1][j]; //基础情况; if(j >= vi && dp[i][j-vi] != -1){ dp[i][j] = max( dp[i][j], dp[i][j-vi] + wi ); } } } int exact = dp[n][v]; res.push_back(exact == -1? 0:exact); return res; } };