日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

背包问题学习笔记(二)

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 背包问题学习笔记(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0-1背包問題解決代碼,騰訊的試題中,只需將物品的價值與物品的重量取一樣的值即可。

PackProblemClass.h:

// PackProblemClass.h: interface for the PackProblemClass class. // //#if !defined(AFX_PACKPROBLEMCLASS_H__60EB89B2_4A0F_4085_8973_AC42DE6842E5__INCLUDED_) #define AFX_PACKPROBLEMCLASS_H__60EB89B2_4A0F_4085_8973_AC42DE6842E5__INCLUDED_#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000class PackProblemClass { public:int S;//背包的容量為Sint N;//物品的件數為Nint *w;//物品的重量 N維數組int *v;//物品的價值 N維數組int *x;//背包裝的物品價值最大時對應的物品種類 N維數組 x[i]=1表示第i個物品在背包中int V;//背包能裝下的最大價值void DynamicProgramming();//進行動態規劃,計算最大價值V,和對應的物品組合xvoid ResultOutput();//將動態規劃結果輸出PackProblemClass(int iS,int iN,int *iw,int *iv);//構造函數virtual ~PackProblemClass();//析構函數};#endif // !defined(AFX_PACKPROBLEMCLASS_H__60EB89B2_4A0F_4085_8973_AC42DE6842E5__INCLUDED_)

?PackProblemClass.cpp:

// PackProblemClass.cpp: implementation of the PackProblemClass class. // //#include "stdafx.h" #include "PackProblemClass.h" #include <iostream>using namespace std;// // Construction/Destruction // //背包問題類 PackProblemClass::PackProblemClass(int iS,int iN,int *iw,int *iv) {this->S = iS;//背包的容量為Sthis->N = iN;//物品的件數為Nthis->w = iw;//物品的重量 N維數組this->v = iv;//物品的價值 N維數組this->V = 0;//背包能裝下的最大價值this->x = new int[N];//背包裝的物品價值最大時對應的物品種類 N維數組 x[i]=1表示第i個物品在背包中for(int i=0;i<N;i++)//初始化x{x[i] = 0;} }void PackProblemClass::DynamicProgramming()//進行動態規劃,計算最大價值V,和對應的物品組合x {int temp_S = S + 1;int i,j; //動態定義并初始化二維數組int **c;c = new int*[N+1];for(i=0;i<=N;i++){c[i] = new int[temp_S];}for(i=0;i<=N;i++){for(j=0;j<=S;j++){c[i][j] = 0;}}////根據公式c[i][j]=MAX{c[i-1][j],c[i-1][j-w[i-1]+v[i-1]]}計算c[][]for(i=1;i<=N;i++){for(j=1;j<=S;j++){if (j>=w[i-1]) {if (c[i-1][j]<(c[i-1][j-w[i-1]]+v[i-1])) {c[i][j] = c[i-1][j-w[i-1]]+v[i-1];}else{c[i][j] = c[i-1][j];}}else{c[i][j] = c[i-1][j];}}}//輸出c[][]for(i=0;i<=N;i++){for(j=0;j<=S;j++){cout<<c[i][j]<<" ";}cout<<endl;}///逆推法計算最大值V時對應的物品組合xV = c[N][S];temp_S = S;for(i=N;i>0;i--){if (c[i][temp_S]>c[i-1][temp_S]) {x[i-1] = 1;temp_S = temp_S - w[i-1];}}}void PackProblemClass::ResultOutput()//將動態規劃結果輸出 {cout<<"背包的容量:"<<S<<endl;cout<<"物品的件數:"<<N<<endl;cout<<"物品的重量:"<<endl;int i;for(i=0;i<N;i++)cout<<w[i]<<" "<<endl;cout<<endl;cout<<"物品的價值:"<<endl;for(i=0;i<N;i++)cout<<v[i]<<" "<<endl;cout<<endl;cout<<"動態規劃的結果為:"<<endl;cout<<"背包所能裝下的物品的最大價值為:"<<V<<endl;cout<<"物品的種類:"<<endl;for(i=0;i<N;i++)cout<<x[i]<<" "<<w[i]<<" "<<v[i]<<endl;cout<<endl;}PackProblemClass::~PackProblemClass() {}

?

轉載于:https://www.cnblogs.com/finalsatan/p/4057058.html

總結

以上是生活随笔為你收集整理的背包问题学习笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。