【leetcode】背包问题汇总
1. 背包问题 I —— 0-1背包无价值
二维数组
class Solution {
public:
/**
* @param m: An integer m denotes the size of a backpack
* @param A: Given n items with size A[i]
* @param V: Given n items with value V[i]
* @return: The maximum value
*/
int backPackII(int m, vector<int> &A, vector<int> &V) {
vector<vector<int> > dp(A.size()+1,vector<int>(m+1,0));
//二维数组
for(int i=1;i<A.size()+1;i++){
for(int j=1;j<m+1;j++){
if(j<A[i-1]){
dp[i][j]=dp[i-1][j];
}else{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-A[i-1]]+V[i-1]);
}
}
}
return dp[A.size()][m];
}
};
一维数组
class Solution {
public:
/**
* @param m: An integer m denotes the size of a backpack
* @param A: Given n items with size A[i]
* @return: The maximum size
*/
int backPack(int m, vector<int> &A) {
// write your code here
int n = A.size();
vector<int> dp(m + 1, 0);
int i,j;
for(i=0; i<n; i++)
{
for(j=m; j > A[i] - 1 ; j--)
{
dp[j] = max(dp[j], (dp[j - A[i]] + A[i]));
}
}
return dp[m];
}
};
2. 背包问题II —— 0-1背包有价值
二维数组
class Solution {
public:
/**
* @param m: An integer m denotes the size of a backpack
* @param A: Given n items with size A[i]
* @param V: Given n items with value V[i]
* @return: The maximum value
*/
int backPackII(int m, vector<int> &A, vector<int> &V) {
// write your code here
int n = A.size();
vector<vector<int>> dp(n+1,vector<int>(m+1,0));
int i,j;
for(i = 1; i < n+1; i++)
{
for(j = 1; j < m+1; j++)
{
if(j >= A[i-1])
{
dp[i][j] = max(dp[i-1][j], (dp[i-1][j-A[i-1]]+V[i-1]));
}
else
{
dp[i][j] = dp[i-1][j];
}
}
}
return dp[n][m];
}
};
一维数组
class Solution {
public:
/**
* @param m: An integer m denotes the size of a backpack
* @param A: Given n items with size A[i]
* @param V: Given n items with value V[i]
* @return: The maximum value
*/
int backPackII(int m, vector<int> &A, vector<int> &V) {
// write your code here
int n = A.size();
vector<int> dp(m+1,0);
int i,j;
for(i = 0; i < n; i++)
{
for(j = m; j >= A[i]; j--)
{
dp[j] = max(dp[j], (dp[j-A[i]]+V[i]));
}
}
return dp[m];
}
};
3. 背包问题III —— 完全背包问题
完全背包问题,有价值无限个数:https://www.lintcode.com/problem/backpack-iii/description
class Solution {
public:
/**
* @param A: an integer array
* @param V: an integer array
* @param m: An integer
* @return: an array
*/
int backPackIII(vector<int> &A, vector<int> &V, int m) {
// write your code here
int n = A.size();
vector<vector<int>> dp(n+1,vector<int>(m+1,0));
int i,j,k;
for(i = 1; i < n+1; i++)
{
for(j = 1; j < m+1; j++)
{
k = 1;
dp[i][j] = dp[i-1][j];
while(j >= k * A[i-1])
{
dp[i][j] = max(dp[i][j], (dp[i-1][j - k*A[i-1]]+ k*V[i-1]));
k++;
}
}
}
return dp[n][m];
}
};