算法 背包问题

来源:互联网 发布:网络经过路由器变慢了 编辑:程序博客网 时间:2024/06/06 09:36

今天看了背包问题,采用贪心的策略,比如给定包容量为10, 那么物品数是:【1,4,3,2,6,7】,那么可以递归的取思考问题(我同事递归的思想掌握的非常好,出神入化),那么考虑两种情况:1、将1加入包中,剩余的问题是【4,3,2,6,7】,给定包容量为10-1=9;2、不将1加入包中,在【4,3,2,6,7】中,给定包容量为10;然后比较这两种情况的返回值的大小,取大的值。


以下算法,采用一个数组,来记录之前见过的物品容量,以及见过的物品容量的加和,由此判断,遍历完所有物品后,最大的可以选择的物品容量和:


int backPack(int m, vector<int> A) {
// f[]表示当前见过哪些物品,并且记录这些物品的和
bool *f = new bool[m + 1]; // 用f[]来记录考虑了实际物品情况,包实际可以装的物品量<=m
for (int i = 0; i <= m; i++) {
f[i] = false;
}
f[0] = true;
// 对于第一个容量为2的物品,则f[0] = true, f[2] = true,下次出现容量为8的物品,则f[10] = 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]]; // 如果当前包容量减去当前这个物品的体积后,仍是true
}
}
for (int i = m; i >= 0; i--) {
if (f[i]) {
return i;
}
}
return 0;
}


有背包九讲问题,之后陆续更新

0 0