C語言分支限界法求解01背包問題

分支限界法是一種求解優化問題的算法,針對01背包問題,它可以通過在搜索過程中剪枝,減少搜索空間的大小,提高算法的效率。

具體來說,分支限界法會將當前狀態下的可行解集合分成若干個子集,每個子集代表一條搜索路徑,然后根據某種啟發式策略(如最大價值優先、最小重量優先等)對這些子集進行排序,選擇價值最大/重量最小的子集進行擴展,將其分成若干個子集,再重復上述過程,直到找到最優解或者搜索結束。

在求解01背包問題時,分支限界法每次擴展節點時,會判斷當前節點能否產生更優的解,如果不能,就進行剪枝,減少搜索空間。例如,如果當前節點已經超出了背包的容量限制,就可以直接剪枝,不再繼續擴展。在搜索過程中,分支限界法還會維護一個上界,即當前可行解集合中的最優解,如果當前節點的下界已經小于上界,也可以直接剪枝,不再繼續擴展。

分支限界法是一種高效、精確的求解優化問題的算法,但需要注意的是,它并不保證一定能找到最優解,因為搜索空間較大時,其時間復雜度可能會非常高。

代碼:

#include <stdio.h>
#include <stdlib.h>#define MAX_N 1000  // 最大物品數量
#define MAX_W 1000  // 最大背包容量int n;  // 物品數量
int w[MAX_N];  // 物品重量
int v[MAX_N];  // 物品價值
int c;  // 背包容量
int maxv;  // 最大價值
int curw;  // 當前背包重量
int curv;  // 當前背包價值
int bestv[MAX_W];  // bestv[i]表示當前索引為i時,背包容量為i時的最大價值// 計算以j為索引、背包容量為c的情況下,能夠獲得的最大價值
int bound(int j, int c) {int b = curv;int leftw = c - curw;while (j < n && leftw >= w[j]) {leftw -= w[j];b += v[j];j++;}if (j < n) {b += leftw * v[j] / w[j];}return b;
}// 搜索第i個物品是否放入背包
void dfs(int i) {if (i == n) {  // 達到葉子節點,更新最大價值maxv = curv;return;}// 不選第i個物品bestv[i+1] = bound(i+1, c);  // 計算下一個物品的最大價值if (bestv[i+1] < maxv) {  // 如果最大價值都小于當前最大價值,直接返回return;}dfs(i+1);// 選第i個物品if (curw + w[i] <= c) {  // 可以放入背包curw += w[i];curv += v[i];if (curv > maxv) {  // 更新最大價值maxv = curv;}bestv[i+1] = bound(i+1, c);  // 計算下一個物品的最大價值if (bestv[i+1] > maxv) {  // 如果最大價值比當前最大價值大,繼續搜索dfs(i+1);}curw -= w[i];  // 回溯curv -= v[i];}
}int main() {// 讀入數據scanf("%d%d", &n, &c);for (int i = 0; i < n; i++) {scanf("%d%d", &w[i], &v[i]);}// 初始化maxv = curv = 0;curw = 0;bestv[0] = bound(0, c);// 搜索dfs(0);// 輸出結果printf("%d\n", maxv);return 0;
}

分支限界法的思路如下:

  1. 按照某種規則先對問題求出一個下界,把問題分成可行和不可行兩種情況。對于可行的情況,可以計算出對應的最優解的上界(貪心法、動態規劃等)。
  2. 依次搜索所有可能的解,在搜索過程中,利用計算出的上界剪枝,即當某個節點的上界小于當前最優解時,可以直接返回上一層,省略掉這個分支。
  3. 在搜索過程中,記錄當前的最優解,并不斷更新。當達到葉子節點,即搜索結束時,返回最優解。

對于01背包問題,每個節點有兩種情況,即選或不選當前物品。對于每個節點,可以計算出剩余物品的最大價值,從而計算出當前節點可以達到的最大價值(上界)。用一個數組bestv記錄每個節點的最大價值,如果當前節點的上界小于當前最優解,直接返回;如果當前節點的最大價值比當前最優解大,繼續搜索。在搜索過程中,使用變量curwcurv記錄當前的背包重量和價值,變量maxv記錄當前的最大價值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163758.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163758.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163758.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java特殊文件讀取案例Properties

代碼 package com.itheima.d1;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.util.Properties;public class Test3 {public static void main(String[] args) throws Exception {//目標&#xff1a;讀取屬性文件…

SpringBoot通過@Scheduled實現定時任務

Spring自帶的定時任務系統&#xff0c;使用注解時必須指定任意一個參數&#xff08;屬性&#xff09;&#xff1a;cron、fixedDelay或fixedRate&#xff1b; 1. 啟動類添加開啟注解 EnableScheduling 2. cron參數 /** * cron 一共可以有7個參數 以空格分開 其中年不是必須參…

java項目之品牌銀飾售賣平臺(ssm+vue)

項目簡介 主要功能包括首頁、個人中心、用戶管理、促銷活動管理、飾品管理、我的收藏管理、系統管理、訂單管理等。管理員模塊: 管理員可以查詢、編輯、管理每個用戶的信息和系統管理員自己的信息&#xff0c;同時還可以編輯、修改、查詢用戶賬戶和密碼&#xff0c;以及對系統…

EMG肌肉電信號處理合集(三)

本文主要展示常見的肌電信號預處理的實現&#xff0c;開發環境為matlab。 目錄 1 肌電信號低通&#xff0c;高通&#xff0c;帶通濾波 2 去除DC 0階偏置&#xff0c;1階偏置 3 全波整流 4 信號降采樣 5 linear envolope / butterworth 低通濾波器 1 肌電信號低通&#xf…

pdf.js插件怎么控制工具欄的顯示與隱藏

最近做了一個需求&#xff0c;需要實現pdf文件的預覽&#xff0c;但是只是提供預覽功能&#xff0c;不需要展示相關的工具欄&#xff0c;所以需要把工具欄隱藏掉。我用的插件是pdf.js 官網地址&#xff1a;http://mozilla.github.io/pdf.js/ 中文文檔地址&#xff1a;https://…

鄰趣連接力:如何無代碼集成CRM、電商平臺和營銷系統,提升廣告推廣效率

連接即服務&#xff1a;鄰趣無代碼集成方法 傳統的電商系統集成過程需要大量的時間和資源進行API開發&#xff0c;這不僅耗時耗力&#xff0c;還需要專業的技術團隊支持。然而&#xff0c;鄰趣通過提供一種無需API開發的連接方法&#xff0c;極大地簡化了整個集成過程。商家只…

vue3 滾動條回到頂部

需求&#xff1a; 在頁面a&#xff0c;滑動了滾動條&#xff0c;再進入頁面b&#xff0c;但是頁面B記錄了滾動條位置 現在想要&#xff0c;進入頁面B,不記錄之前的滾動條&#xff0c; 代碼 //頁面B <div class"center" ref"centerRef">頁面B </…

信號...

信號的產生&#xff1a;外賣小哥給我打電話說你外賣到了 信號的保存&#xff1a;我可能正在推高地&#xff0c;腦子里面記住我外賣到了&#xff0c;一會再去拿 信號的處理&#xff1a;我打完了&#xff0c;下樓把外賣拿了 完成了一次信號的生命周期

VSDX Annotator v1.16.1(Visio 繪圖注釋工具)

VSDX Annotator是一款在Mac上操作MSVisio繪圖的工具&#xff0c;提供了廣泛的注釋可能性&#xff0c;以及在多平臺環境中共享可視文檔。它確保共有12個注釋工具&#xff0c;并允許添加注釋、標注、注釋、塊、圖形文件等。該應用程序允許用戶在Mac上查看Visio流程圖、圖表、方案…

Cartographer實現雙雷達建圖

Urdf修改 <?xml version="1.0" ?> <robot name="robot"><link name="base_link" /><link name="laser_1" /><link name="laser_2" /><link name="laser_link" /><join…

13.什么是Spring beans?

什么是Spring beans&#xff1f; Spring 官方文檔對 bean 的解釋是&#xff1a; In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assem…

大數據-計算框架選型與對比

計算框架選型與對比 一、大數據平臺二、計算框架分類1.批處理架構2.實時流處理架構3.流批一體處理架構 三、計算框架關鍵指標1.處理模式2.可伸縮性3.消息傳遞3.1 至少一次&#xff08;at least once&#xff09;3.2 至多一次&#xff08;ai most once&#xff09;3.3 恰好一次&…

邊海防可視化智能視頻監控與AI監管方案,助力邊海防線建設

一、背景與需求 我國有3萬多公里的邊境線和海岸線&#xff0c;隨著我國邊海防基礎設施建設的快速發展&#xff0c;邊海安防也逐漸走向智能化。傳統人工巡防的方式已經無法滿足邊海智能化監管的需求&#xff0c;在沿海、沿邊地區進行邊海智慧安防視頻監控系統等邊海防基礎設施建…

智慧海島/海域方案:助力海洋空間智慧化、可視化管理

隨著我國海洋經濟的快速發展&#xff0c;海域海島的安防技術也獲得了進步。傳統的安防監控模式已經滿足不了海域海島的遠程監管需求。伴隨著人工智能、邊緣計算、大數據、通信傳輸技術、視頻技術、物聯網等信息化技術的發展&#xff0c;海島海域在監管手段上&#xff0c;也迎來…

【Spring Cloud實戰】分布式系統控制與組件應用

在現代軟件開發中&#xff0c;分布式系統已經成為一種常見的架構模式&#xff0c;被廣泛應用于各種規模的企業和組織中。這種架構模式通過將應用程序拆分為獨立的組件&#xff0c;并分布在不同的計算機節點上運行&#xff0c;使得系統能夠應對高負載和大規模的數據處理需求&…

python tkinter使用(四)

本篇文章主要講下tkinter 的文本框相關. tkinter中用Entry來實現輸入框,類似于android中的edittext. 具體的用法如下: 1:空白輸入框 如下: name tk.Entry(window) name.pack()2: 設置輸入框的默認文案 name tk.Entry(window) name.pack() name.insert(tk.END, "請…

使用支付寶的沙箱環境在本地配置模擬支付并發布至公網調試

文章目錄 前言1. 下載當面付demo2. 修改配置文件3. 打包成web服務4. 局域網測試5. 內網穿透6. 測試公網訪問7. 配置二級子域名8. 測試使用固定二級子域名訪問9. 結語 前言 在沙箱環境調試支付SDK的時候&#xff0c;往往沙箱環境部署在本地&#xff0c;局限性大&#xff0c;在沙…

vue .prop修飾符

一、官網概念 .prop - 強制綁定為 DOM property 原本自定義屬性默認會綁定在DOM的attributes上&#xff0c;加上prop之后會綁定在property&#xff0c;attributes上就不存在咯 在頁面上的一個明顯區別就是&#xff1a;不加prop時&#xff0c;DOM渲染后自定義屬性和值都是暴露在…

自定義label組件

自定義label組件 支持邊框繪制 支持shape背景(按指定圓角裁剪,矩形,圓角矩,圓形),支持指定角圓角 支持自定義陰影(顏色,偏移,深度) 邊框顏色支持狀態選擇器 預覽 核心繪制輔助類 public class LabelHelper {private final Paint paint;private Paint shadowPaint;private fina…

【無標題】學習HTML

由于工作需求&#xff0c;學習了一些html的相關知識&#xff0c;最終應用到打印功能上使用。 HTML是指超文本標記語言&#xff08;HyperText Markup Language&#xff09;。它是一種用于創建和呈現互聯網上頁面的標準標記語言。HTML是Web開發的基礎&#xff0c;是構建網頁和應…