在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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ī)劃的思想解決了背包問題,并用了兩種算法:迭代法、遞歸法。在迭代法中實現了打印背包問題的表格。

代碼簡述

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

迭代法:

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

遞歸法:

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

源碼示例

#include #include using namespace std;
int **T = NULL;    // 存儲背包問題表格的數組指針
// 返回兩個值的最大值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++)  {    // 打印行數    cout << i << ":	";
    // 打印W列    for (int w = 0; w <= W; w++)    {      cout << T[i][w] << "	";    }
    // 換行    cout << endl;  }}
int main() {  int *w = NULL;    // 存儲每件物品重量的數組指針  int *v = NULL;    // 存儲每件物品價值的數組指針  int n;        // 物品個數n  int W;        // 背包總承重W
  cout << "---------------- 背包問題 ----------------" << endl;  cout << "請輸入物品數 n (n>=0) " << endl;
  // 輸入背包數  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
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7254

    瀏覽量

    91775
  • C++
    C++
    +關注

    關注

    22

    文章

    2119

    瀏覽量

    75199

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    創(chuàng)建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼獲得的結果與Python代碼不同是為什么?

    創(chuàng)建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個推理過程中使用相同的圖像和模型。 從 C++ 代碼獲得的結果與 Python* 代碼不同。
    發(fā)表于 03-06 06:22

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業(yè)的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序。Spire.XLS for C+
    的頭像 發(fā)表于 01-14 09:40 ?612次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件<b class='flag-5'>說明</b>

    EE-112:模擬C++的類實現

    電子發(fā)燒友網站提供《EE-112:模擬C++的類實現.pdf》資料免費下載
    發(fā)表于 01-03 15:15 ?0次下載
    EE-112:模擬<b class='flag-5'>C++</b><b class='flag-5'>中</b>的類實現

    同樣是函數,在CC++中有什么區(qū)別

    同樣是函數,在 CC++ 中有什么區(qū)別? 第一個返回值。 C語言的函數可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++ 的函數,除了構造和析構這兩個特殊的函數,必須
    的頭像 發(fā)表于 11-29 10:25 ?896次閱讀

    基于無操作系統(tǒng)的STM32單片機開發(fā)附源碼

    到地址空間連續(xù)的不同大小的內存空間,且用戶接口簡單,使用方便。 源碼說明 源碼包含memory.h 和 memory.c 兩個文件(嵌入式C
    的頭像 發(fā)表于 11-15 11:24 ?1395次閱讀

    C7000 C/C++優(yōu)化指南用戶手冊

    電子發(fā)燒友網站提供《C7000 C/C++優(yōu)化指南用戶手冊.pdf》資料免費下載
    發(fā)表于 11-09 15:00 ?0次下載
    <b class='flag-5'>C</b>7000 <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>優(yōu)化指南用戶手冊

    TMS320C6000優(yōu)化C/C++編譯器v8.3.x

    電子發(fā)燒友網站提供《TMS320C6000優(yōu)化C/C++編譯器v8.3.x.pdf》資料免費下載
    發(fā)表于 11-01 09:35 ?1次下載
    TMS320<b class='flag-5'>C</b>6000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器v8.3.x

    C語言和C++結構體的區(qū)別

    同樣是結構體,看看在C語言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?753次閱讀

    C7000優(yōu)化C/C++編譯器

    電子發(fā)燒友網站提供《C7000優(yōu)化C/C++編譯器.pdf》資料免費下載
    發(fā)表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    使用OpenVINO GenAI API在C++構建AI應用程序

    許多桌面應用程序是使用 C++ 開發(fā)的,而將生成式AI(GenAI)功能集成到這些應用程序可能會很具有挑戰(zhàn)性,尤其是因為使用像 Hugging Face 這樣的 Python 庫的復雜性。C++
    的頭像 發(fā)表于 10-12 09:36 ?1117次閱讀
    使用OpenVINO GenAI API在<b class='flag-5'>C++</b><b class='flag-5'>中</b>構建AI應用程序

    ostream在c++的用法

    ostream 是 C++ 標準庫中一個非常重要的類,它位于 頭文件(實際上,更常見的是通過包含 頭文件來間接包含 ,因為 包含了 和 )。 ostream 類及其派生類(如 std::cout
    的頭像 發(fā)表于 09-20 15:11 ?1910次閱讀

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經是非常貼近開發(fā)的使用習慣與推理方式。與OpenCV的Mat對象對接方式更是幾乎無縫對接,非常的方便好用。
    的頭像 發(fā)表于 07-26 09:20 ?1554次閱讀

    ModusToolbox 3.2在c代碼包含c++代碼的正確步驟是什么?

    使用 ModusToolbox 3.2 我有一個用純 C 語言編寫的 XMC4700 項目。 我正在嘗試添加一些 C++ 函數,并將其合并到我的原始代碼。 我可以構建獨立的 .cpp/.hpp
    發(fā)表于 07-23 08:21

    C++語言基礎知識

    電子發(fā)燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發(fā)表于 07-19 10:58 ?10次下載

    C++實現類似instanceof的方法

    函數,可實際上C++沒有。但是別著急,其實C++中有兩種簡單的方法可以實現類似Java的instanceof的功能。 在 C++
    的頭像 發(fā)表于 07-18 10:16 ?925次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實現類似instanceof的方法
    主站蜘蛛池模板: 精品色图 | 黄网在线免费观看 | 国产福利午夜自产拍视频在线 | 久久伊人成人 | 黄网免费观看 | 国产美女精品久久久久中文 | 99精品国产高清自在线看超 | 狠狠干狠狠干狠狠干 | 无遮挡很污很爽很黄的网站 | 日本a级片在线观看 | 天天艹 | 欧美人与物另类 | 午夜欧美电影 | 国产情侣草莓视频在线 | 日日做夜夜爽夜夜爽 | 亚洲一区在线观看视频 | 色偷偷成人网免费视频男人的天堂 | 国产裸体美女视频全黄 | 毛片快播 | 欧美伊人久久综合网 | 中国一级特黄特色真人毛片 | 美女张开大腿让男人桶 | 色老头·com 色老头成人免费综合视频 色老头久久久久 | 在线亚洲一区二区 | 中文字幕1区2区 | 四虎影院官网 | 国产大毛片 | 好爽好黄的视频 | 人人看人人鲁狠狠高清 | 99久久国产免费 - 99久久国产免费 | 91久久夜色精品国产网站 | 国产一级特黄aa大片免费 | 亚洲人成人77777网站 | 久久99久久精品免费思思6 | 久久精品操 | 欧美精品一区在线看 | aa视频免费看 | 一区二区三区精品视频 | 色www视频永久免费 色www视频永久免费软件 | 欧美人与性另类 | 男男h文小说阅 |