来源:Backpack
防止忘记。
二维代码:
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
using namespace std;
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
if (A.empty() || m < 1) return 0;
const int N = A.size() + 1;
const int M = m + 1;
vector<vector<bool> > dp(N, vector<bool>(M, false));
dp[0][0] = true;
for (int i = 1; i < N; ++i) {
for (int j = 0; j < M; ++j) {
dp[i][j] = dp[i - 1][j];
if (j >= A[i - 1] && dp[i - 1][j - A[i - 1]]) {
dp[i][j] = true;
}
}
}
// return the largest i if true
for (int i = M; i > 0; --i) {
if (dp[N - 1][i - 1]) {
return (i - 1);
}
}
return 0;
}
};
注意:
- 第一个for循环中,i从1开始,j从0开始;i循环了A.size() 次,i的值从1到A.size() ,因为i表示A中的第i个元素。
- j循环了m+1次,j的值从0到m ,因为j表示的是背包中的物品总重量,而总的重量可以是[0, m]。
- 对A的操作下标为i-1,因为i的意思是第i个元素,对应的下标减1.