在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]
n个整数a[1..n],装m的背包
state: f[i][j] “前i”个数,取出一些能否组成和为jfunction: f[i][j] = f[i-1][j - a[i]] or f[i-1][j]
intialize: f[X][0] = true; f[0][1..m] = false
answer: 能够使得f[n][X]最大的X(0<=X<=m)
int backPack(int m, vector<int> A) {
bool f[m + 1];
for (int i = 0; i <= m; i++) {
f[i] = false;
}
f[0] = true;
for (int j = 0; j < A.size(); j++) {
for (int i = m; i >= A[j]; i--) {
f[i] = f[i] || f[i - A[j]];
} // for j
} // for i
for (int i = m; i >= 0; i--) {
if (f[i]) {
return i;
}
}
return 0;
}