125. Backpack II 元素不重复使用

int backPackII(int m, vector<int> &A, vector<int> &V) { // write your code here // dp[i][j]: max value with i packsize and first j elements; // transition: 能放:1)放 2)不放 -> max(dp[i][j - 1], dp[i - A[j - 1]][j - 1] + V[j - 1]) // 不能放:dp[i][j] = dp[i][j - 1] // initial : dp[0][0] = 0; const int size = A.size(); vector<vector<int>> dp(m + 1, vector<int>(size + 1, 0)); for(int i = 1; i <= m; i++){ for(int j = 1; j <= size; j++){ if(i >= A[j - 1]){ dp[i][j] = max(dp[i][j - 1], dp[i - A[j - 1]][j - 1] + V[j - 1]); } else{ dp[i][j] = dp[i][j - 1]; } } } return dp[m][size]; }

优化成一维数组
/为什么从右往左?把原来的二维看成矩阵,每次更新都是基于上一行的结果,
所以在一维下,要从右往左,这样用于更新的值相当于是上一次的结果。如果从左往右,左边的值都变了。
int backPackII(int m, vector<int> &A, vector<int> &V) { // write your code here // dp[i][j]: max value with i packsize and first j elements; // transition: 能放:1)放 2)不放 -> max(dp[i][j - 1], dp[i - A[j - 1]][j - 1] + V[j - 1]) // 不能放:dp[i][j] = dp[i][j - 1] // initial : dp[0][0] = 0; const int size = A.size(); //vector<vector<int>> dp(m + 1, vector<int>(size + 1, 0)); vector<int> dp(m + 1, 0); for(int i = 1; i <= size; i++){ for(int j = m; j >= A[i - 1]; j--){ //为什么从右往左?把原来的二维看成 //if(i >= A[j - 1]){ // dp[i][j] = max(dp[i][j - 1], dp[i - A[j - 1]][j - 1] + V[j - 1]); dp[j] = max(dp[j], dp[j - A[i - 1]] + V[i - 1]); //} // else{ // dp[i][j] = dp[i][j - 1]; // } } } //return dp[m][size]; return dp[m]; }

Comments

Popular posts from this blog

Amazon OA 763. Partition Labels

1427. Split Array into Fibonacci Sequence

05/25 周一