数据结构|背包问题求解(数据结构课设)


文章目录

  • 一、题目
  • 二、功能模块图
  • 三、问题分析
  • 四、实验结果及分析
  • 五、源码
  • 总结

一、题目 【数据结构|背包问题求解(数据结构课设)】?背包问题的求解:假设有一个能装入总体积为T的背包和n件体积分别为w1 , w2 , … , wn 的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1 +w2 + … + wn=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解:
(1,4,3,2)
(1,4,5)
(8,2)
(3,5,2)。
二、功能模块图 数据结构|背包问题求解(数据结构课设)
文章图片

三、问题分析 按照问题描述
1.处理好数据读入 。
2.再分别标记背包剩余容量,即当前处理到的物品i,用栈存储需 要放进书包里的物品。
3.在循环里处理数据,当判断到处理完毕,用 break 退出循环。先判断物品能否放入背包,能则压进栈,然后判断剩余容量是否为 0,若为 0,输出结果,并且使栈和i为下一情况,若不为0,则通过进一步判断决i的值和栈的状态。
四、实验结果及分析 背包问题求解:输入测试样,并得出解。与书中测试结果一致。由此判断完成题目要求。
数据结构|背包问题求解(数据结构课设)
文章图片

另外还存在以下几种无解情况,当背包体积过大,或物品体积过大时均无解,如下所示。
数据结构|背包问题求解(数据结构课设)
文章图片

五、源码 main.cpp
#include #include #include #define max 1000 using namespace std; int main() { // read the datas int T, n; int W[max]; bool found = false; cout << "请输入背包大小: "; cin >> T; cout <> n; cout <> W[j]; cout << endl << "解有 : " << endl; // process int left = T; stack s; int i = 0; while (1) { if (left == W[i] || (left > W[i] && i < n)) {// 可以放进背包的情况 s.push(i); left -= W[i]; }if (left == 0) {// 刚好装满 // 标记 found = true; // 输出结果 stack t; while (!s.empty()) { t.push( s.top()); s.pop(); } cout << "( "; while (!t.empty()) { cout << W[t.top()] << " "; s.push(t.top()); t.pop(); } cout << ")" <

总结 此为本人2022年大二下学期数据结构课设中的一道题目。特此记录。

    推荐阅读