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;
}
};