问题描述:一个背包可以放入的物品总体积T,现有n件物品。其各自的体积值存储于数组w中,分别为w[0],w[1],...w[n-1];求解是否存在若干件物品可以放入包中,使得放入的体积之和正好为T。有解输出,无解输出无解信息。
1. void KNAP(int T, int w[], int n){
2. int stack[n]; //模拟栈
3. int top = -1; //栈顶
4. int i = 0; //当前要加入的物品
5. while(top > -1 || i<n){
6. while(T-w[i]>0 && i<n){ //将i物品放入背包
7. stack[++top] = i;
8. T -= w[i];
9. i++;
10. }
11. if(T == 0){ //说明有解 输出并退出
12. while(top > -1){
13. cout << w[stack[top--]] << " ";
14. }
15. return ;
16. }
17. //没找到解后放出一个物品 试试下面的物品
18. i = stack[top--]; //出栈
19. T += w[i];
20. i++; //从下一个位置开始尝试
21. }
22. cout << "无解" <<endl; //上述未返回则无解
23. }