日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++中的背包問題說明和源碼示例

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:C語言編程學習基地 ? 2021-10-12 09:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

問題說明

有N件物品和一個容量為V的背包。

第i件物品的重量是w[i],價值是v[i]。

求解將哪些物品裝入背包可使這些物品的重量總和不超過背包容量,

且價值總和最大。

功能說明

本程序用動態(tài)規(guī)劃的思想解決了背包問題,并用了兩種算法:迭代法、遞歸法。在迭代法中實現(xiàn)了打印背包問題的表格。

代碼簡述

通過用戶輸入數(shù)據(jù),程序輸入檢測,動態(tài)分配空間,選擇算法, 用動態(tài)規(guī)劃的思想求解背包問題。

迭代法:

通過遍歷n行W列,迭代每行每列的值,并把最優(yōu)解放到 n行(在數(shù)組中為第n+1行)W列(在數(shù)組中為第W+1列)中。

遞歸法:

通過每次返回前i個物品和承重為j的最優(yōu)解, 遞歸計算總背包問題的最優(yōu)解。

源碼示例

#include #include using namespace std;
int **T = NULL;    // 存儲背包問題表格的數(shù)組指針
// 返回兩個值的最大值int max(int a, int b) {  return (a > b) ? a : b;}
// 迭代法,能顯示背包問題的表格int packIterative(int n, int W, int *w, int *v) {    // 循環(huán)遍歷n行  for (int i = 1; i <= n; ++i)  {    // 循環(huán)遍歷W列    for (int j = 1; j <= W; ++j)    {      //第i個物品能裝下,則比較包括第i個物品和不包括第i個物品,取其最大值      if (w[i] <= j)        T[i][j] = max(v[i] + T[i - 1][j - w[i]], T[i - 1][j]);
      // 第i個物品不能裝下,則遞歸裝i-1個      else        T[i][j] = T[i - 1][j];    }  }  return T[n][W];}
// 遞歸法,不支持顯示背包問題的表格int packRecursive(int n, int W, int *w, int *v) {  // 結束條件(初始條件),i或者j為0時最大總價值為0  if (n == 0 || W == 0) {    return 0;  }  // 第i個物品不能裝下,則遞歸裝i-1個  if (w[n] > W) {    return packRecursive(n - 1, W, w, v);  }  //第i個物品能裝下,則比較包括第i個物品和不包括第i個物品,取其最大值  else {    return max(v[n] + packRecursive(n - 1, W - w[n], w, v), packRecursive(n - 1, W, w, v));  }}
// 打印背包問題的表格void printT(int n, int W){  // 打印n行  for (auto i = 0; i <= n; i++)  {    // 打印行數(shù)    cout << i << ":	";
    // 打印W列    for (int w = 0; w <= W; w++)    {      cout << T[i][w] << "	";    }
    // 換行    cout << endl;  }}
int main() {  int *w = NULL;    // 存儲每件物品重量的數(shù)組指針  int *v = NULL;    // 存儲每件物品價值的數(shù)組指針  int n;        // 物品個數(shù)n  int W;        // 背包總承重W
  cout << "---------------- 背包問題 ----------------" << endl;  cout << "請輸入物品數(shù) n (n>=0) " << endl;
  // 輸入背包數(shù)  cin >> n;
  if (cin.fail() || n < 0)  {    cout << "輸入n錯誤!" << endl;    system("pause");    return 0;  }
  cout << "請輸入背包承重量 W (W>=0) " << endl;
  // 輸入背包承重量  cin >> W;
  if (cin.fail() || W < 0)  {    cout << "輸入W錯誤!" << endl;    system("pause");    return 0;  }
  // 分配空間  // 對w和v分配n+1大小  w = new int[n + 1];  v = new int[n + 1];
  // 對T分配n+1行,并初始化為0  T = new int *[n + 1]();  // 對T分配W+1列,并初始化為0  for (auto i = 0; i <= n; i++)  {    T[i] = new int[W + 1]();  }
  // 輸入背包的重量和價值  for (auto i = 1; i <= n; i++)  {    cout << "請輸入第 " << i << " 個物品的重量和價值(用空格隔開)" << endl;    cin >> w[i] >> v[i];    if (cin.fail() || w[i] < 0 || v[i] < 0)    {      cout << "輸入錯誤!" << endl;      system("pause");      return 0;    }  }
  cout << "------------------------------------------------" << endl;  cout << "請選擇算法:" << endl;  cout << "【1】迭代法" << endl;  cout << "【2】遞歸法" << endl;  cout << "------------------------------------------------" << endl;
  int choose;
  // 輸入算法的選擇  cin >> choose;  switch (choose)  {  case 1:  {    // 迭代法,能顯示背包問題的表格    cout << "能裝下物品的最大價值為 " << packIterative(n, W, w, v) << endl;    cout << "------------------------------------------------" << endl;    printT(n, W);    break;  }  case 2:  {    // 遞歸法,不支持顯示背包問題的表格    cout << "能裝下物品的最大價值為 " << packRecursive(n, W, w, v) << endl;    break;  }  default:  {    cout << "輸入錯誤!" << endl;    break;  }  }
  cout << "------------------------------------------------" << endl;
  delete w;  delete v;  for (int i = 0; i <= n; ++i) {    delete[] T[i];  }  delete[] T;
  system("pause");  return 0;}

今天的分享就到這里了,大家要好好學C++喲~

責任編輯:haq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)

    關注

    8

    文章

    7349

    瀏覽量

    95055
  • C++
    C++
    +關注

    關注

    22

    文章

    2131

    瀏覽量

    77417

原文標題:C++經典算法問題:背包問題(迭代+遞歸算法)!含源碼示例

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    使用VectorCAST/C++的AI輔助測試功能

    從2026版本開始,VectorCAST/C++推出首批AI輔助測試功能,旨在幫助開發(fā)團隊解決單元測試過程的兩個核心難點:
    的頭像 發(fā)表于 04-27 14:37 ?301次閱讀

    EtherCAT應用示例,GOAL 應用說明

    計的。 In goal_appl.c是 GOAL 和 EtherCAT 堆棧的初始化。示例應用程序的行為由以下控制goal_app_ecat.c,而對象字典是由goal_appl_ecat_objects.
    發(fā)表于 04-23 08:19

    C++與lua聯(lián)合編程

    核心課》對“Lua 棧機制”的深度剖析,絕不僅是一次枯燥的源碼閱讀,而是一套關于“跨系統(tǒng)交易成本最小化”與“算力資產精準重組”的底層方法論。徹底搞懂 Lua 棧,本質上就是掌握了在 C++ 與 Lua
    發(fā)表于 04-19 16:27

    C++:const 的空間,常量也能占內存?

    5g.5jh.dg8sg.cnJIWWQc++語言 c++語言5g.Zq2.dg8sg.cnJIWWQc++語言 def lock_tetromino(self): \"\"\"將落地的方塊鎖定到網(wǎng)格
    發(fā)表于 04-16 19:19

    keil實現(xiàn)cc++混合編程

    起因項目中使用到一個開源的模擬IIC的庫,封裝的比較好,但是是使用c++寫的。于是將其移植到自己的項目中,主要有以下三步操作: 在工程選項 C/C++中去掉勾選
    發(fā)表于 01-26 08:58

    C語言與C++的區(qū)別及聯(lián)系

    缺點:性能比面向過程低。 二、具體語言上的區(qū)別 1、關鍵字的不同 C語言有32個關鍵字;C++有63個關鍵字。 2、后綴名不同 C源文件后綴.c,
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    1、語法兼容性: C++完全兼容C語言的語法,這意味著任何有效的C語言程序都可以直接在C++編譯器下編譯通過。 2、底層控制: C++
    發(fā)表于 12-11 06:51

    C語言和C++之間的區(qū)別是什么

    區(qū)別 1、面向對象編程 (OOP): C語言是一種面向過程的語言,它強調的是通過函數(shù)將任務分解為一系列步驟進行執(zhí)行。 C++C語言的基礎上擴展了面向對象的特性,支持類(class)、封裝、繼承
    發(fā)表于 12-11 06:23

    C/C++條件編譯

    條件編譯是一種在編譯時根據(jù)條件選擇性地包含或排除部分代碼的處理方法。在 C/C++ ,條件編譯使用預處理指令 #ifdef、#endif、#else 和 #elif 來實現(xiàn)。常用的條件編譯指令有
    發(fā)表于 12-05 06:21

    C++程序異常的處理機制

    1、什么是異常處理? 有經驗的朋友應該知道,在正常的CC++編程過程難免會碰到程序不按照原本設計運行的情況。 最常見的有除法分母為零,數(shù)組越界,內存分配失效、打開相應文件失敗等等。 一個程序
    發(fā)表于 12-02 07:12

    C/C++代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate??QAC?項目的相對/根路徑的支持。C++?分析也得到了增強,增加了用于檢測 C++?并發(fā)問題的新檢查,并改進了實體名稱和實
    的頭像 發(fā)表于 10-13 18:11 ?761次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性

    技能+1!如何在樹莓派上使用C++控制GPIO?

    和PiGPIO等庫,C++可用于編程控制樹莓派的GPIO引腳。它提供了更好的性能和控制能力,非常適合對速度和精度要求較高的硬件項目。在樹莓派社區(qū),關于“Python
    的頭像 發(fā)表于 08-06 15:33 ?4521次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    請問如何在C++中使用NPU上的模型緩存?

    無法確定如何在 C++ 的 NPU 上使用模型緩存
    發(fā)表于 06-24 07:25

    在OpenVINO? C++代碼啟用 AddressSanitizer 時的內存泄漏怎么解決?

    在 OpenVINO? C++代碼啟用 AddressSanitizer 時遇到內存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    發(fā)表于 06-23 07:16

    主流的 MCU 開發(fā)語言為什么是 C 而不是 C++

    在單片機的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉。先說內存這道坎兒。您當stm32f4的256kRAM
    的頭像 發(fā)表于 05-21 10:33 ?1229次閱讀
    主流的 MCU 開發(fā)語言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?
    道孚县| 金湖县| 屯留县| 昌平区| 五大连池市| 改则县| 贵州省| 宁化县| 抚宁县| 长丰县| 安陆市| 安庆市| 镇沅| 祥云县| 浦江县| 普定县| 巫山县| 新余市| 大连市| 峡江县| 铁岭县| 定襄县| 南平市| 房山区| 阳泉市| 马鞍山市| 吉林省| 丰宁| 嘉善县| 延川县| 隆德县| 萨迦县| 新建县| 定襄县| 大连市| 沭阳县| 卢龙县| 宾阳县| 南皮县| 漳平市| 碌曲县|