假定有n个物体,其重量、价值以及数量分别为wi、vi、ci,现在给定一个质量上限tw,求最大价值。
穷举法的思想很简单,接空间是一个n维的立方体,每个维度上分别有ci+1个点,遍历这些点就可以了。
代码实现如下:
int bound_knap_bruteforce(int n, int* w, int *v, int* c, int tw){ int path[n] ; int maxvalue = 0; int cw = 0; int cv = 0; for(int i=0;i<n;i++) path[i] = 0; while(1) { int j = 0; while(j < n && path[j] == c[j]) { path[j] = 0; cw -= c[j] * w[j]; cv -= c[j] * v[j]; j++; } if(j < n) { path[j] ++ ; //here we evaluate cv += v[j]; cw += w[j]; if (cw <= tw && cv > maxvalue) maxvalue=cv; } else break; } return maxvalue; }
这种方法的缺点是低效,因为要遍历所有的节点,其中可能有很大部分节点都是不满足的,好处是容易理解以及逻辑简单。