01揹包問題詳解(轉載)
上機課題目有一道0-1揹包的問題,上課的時候由於沒有聽課。。所以只有自己再啃書本了。
程式碼雖然不長,但是還是。。很有。。技術含量的。
本人文筆不是很好,所以就 不多說啦!直接上菜!
問題描述:
給定N中物品和一個揹包。物品i的重量是Wi,其價值位Vi ,揹包的容量為C。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大??
在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0-1揹包問題。
問題分析:令V(i,j)表示在前i(1<=i<=n)個物品中能夠裝入容量為就j(1<=j<=C)的揹包中的物品的最大價值,則可以得到如下的動態規劃函式:
(1) V(i,0)=V(0,j)=0
(2) V(i,j)=V(i-1,j) j<wi
V(i,j)=max{V(i-1,j) ,V(i-1,j-wi)+vi) } j>wi
(1)式表明:如果第i個物品的重量大於揹包的容量,則裝人前i個物品得到的最大價值和裝入前i-1個物品得到的最大價是相同的,即物品i不能裝入揹包;第(2)個式子表明:如果第i個物品的重量小於揹包的容量,則會有一下兩種情況:(a)如果把第i個物品裝入揹包,則揹包物品的價值等於第i-1個物品裝入容量位j-wi 的揹包中的價值加上第i個物品的價值vi; (b)如果第i個物品沒有裝入揹包,則揹包中物品價值就等於把前i-1個物品裝入容量為j的揹包中所取得的價值。顯然,取二者中價值最大的作為把前i個物品裝入容量為j的揹包中的最優解。
#include<stdio.h> int V[200][200];//前i個物品裝入容量為j的揹包中獲得的最大價值 int max(int a,int b) { if(a>=b) return a; else return b; } int KnapSack(int n,int w[],int v[],int x[],int C) { int i,j; for(i=0;i<=n;i++) V[i][0]=0; for(j=0;j<=C;j++) V[0][j]=0; for(i=0;i<=n-1;i++) for(j=0;j<=C;j++) if(j<w[i]) V[i][j]=V[i-1][j]; else V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]); j=C; for(i=n-1;i>=0;i--) { if(V[i][j]>V[i-1][j]) { x[i]=1; j=j-w[i]; } else x[i]=0; } printf("選中的物品是:\n"); for(i=0;i<n;i++) printf("%d ",x[i]); printf("\n"); return V[n-1][C]; } void main() { int s;//獲得的最大價值 int w[15];//物品的重量 int v[15];//物品的價值 int x[15];//物品的選取狀態 int n,i; int C;//揹包最大容量 n=5; printf("請輸入揹包的最大容量:\n"); scanf("%d",&C); printf("輸入物品數:\n"); scanf("%d",&n); printf("請分別輸入物品的重量:\n"); for(i=0;i<n;i++) scanf("%d",&w[i]); printf("請分別輸入物品的價值:\n"); for(i=0;i<n;i++) scanf("%d",&v[i]); s=KnapSack(n,w,v,x,C); printf("最大物品價值為:\n"); printf("%d\n",s); }
相關推薦
01揹包問題詳解(轉載)
這個學期開的演算法設計與分析課程老師說是研究生才要學的課,但是我們大二就要學! 雖然有難度,但還是要學滴。 上機課題目有一道0-1揹包的問題,上課的時候由於沒有聽課。。所以只有自己再啃書本了。 程式碼雖然不長,但是還是。。很有。。技術含量的。 本人文筆不是很好,所以就 不多說啦!直接上菜! 問題描述: 給定
WindowManager.LayoutParams 詳解(轉載)
鼠標 chang 結束 name ble edi status 條件 backup WindowManager.LayoutParams 是 WindowManager 接口的嵌套類;繼承於 ViewGroup.LayoutParams 。它的內容十分豐富。其實Window
JQuery中$.ajax()方法參數詳解(轉載)
瀏覽器 object 服務器 字符串 false type: 要求為String類型的參數,請求方式(post或get)默認為get。註意其他http請求方法,例如put和 delete也可以使用,但僅部分瀏覽器支持。timeout: 要求為Number類型的參數,設置請求超時時
Maven詳解(轉載)
odi 解決辦法 ctrl 世界 maven倉庫 避免 -- epo 時間 Maven詳解 一.前言 以前做過的項目中,沒有真正的使用過Maven,只知道其名聲很大,其作用是用來管理jar 包的。最近一段時間在項目過程中使用Maven,用Maven構建的web項目,
主成分分析(PCA)原理詳解(轉載)
增加 信息 什麽 之前 repl 神奇 cto gmail 協方差 一、PCA簡介 1. 相關背景 上完陳恩紅老師的《機器學習與知識發現》和季海波老師的《矩陣代數》兩門課之後,頗有體會。最近在做主成分分析和奇異值分解方面的項目,所以記錄一下心得體會。
linux c/c++ GDB教程詳解(轉載)
spec -h AS 不同的 argv 路徑 scheme execution ram 學習使用了GDB一段時間後,發現它真的好強大!好用! GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調試,
MYSQL-EXPLAIN 命令詳解 (轉載)
test cacheable sel exp 打開慢 一起 select語句 方式 命令詳解 在工作中,我們用於捕捉性能問題最常用的就是打開慢查詢,定位執行效率差的SQL,那麽當我們定位到一個SQL以後還不算完事,我們還需要知道該SQL的執行計劃,比如是全表掃描,還是索引掃
Nginx基礎配置詳解(轉載)
Nginx的功能特性 基本Http服務,可以作為Http代理伺服器和反向代理伺服器,支援通過快取加速訪問,可以完成簡單的負載均衡和容錯,支援包過濾功能,支援SSL 高階Http服務,可以進行自定義配置,支援虛擬主機,支援URL重定向,支援網路監控,支援流媒體傳輸
Intellij IDEA 安裝lombok及使用詳解(轉載)
最近專案中用到了 IDEA 的 Lombok 外掛,這裡做一個記錄。 Lombok 官方說明文件:http://plugins.jetbrains.com/plugin/6317-lombok-plugin 轉載原文地址:
HashMap底層實現原理詳解(轉載)
本文轉自:https://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap詳解 HashMap 和 HashSet 是 Java Collection Framework 的兩個重要成員,其中 HashMap 是
C++中string類詳解(轉載)(最下面有程式碼實現)
作者:yzl_rex 來源:CSDN 原文:https://blog.csdn.net/yzl_rex/article/details/7839379 要想使用標準C++中string類,必須要包含 #include < string>// 注意是< string>
Rsync命令引數詳解(轉載)
在對rsync伺服器配置結束以後,下一步就需要在客戶端發出rsync命令來實現將伺服器端的檔案備份到客戶端來。rsync是一個功能非常強大的工具,其命令也有很多功能特色選項,我們下面就對它的選項一一進行分析說明。 Rsync的命令格式可以為以下六種: 1 rsync
區塊鏈開源實現hyperledger fabric架構詳解(轉載)
hyperledger fabric是區塊鏈中聯盟鏈的優秀實現,主要程式碼由IBM、Intel、各大銀行等貢獻,目前v1.1版的kafka共識方式可達到1000/s次的吞吐量。本文中我們依次討論:區塊鏈的共通特性、fabric核心概念、fabric的交易執行流程。本文來源於筆
oracle的Instr函式詳解(轉載)
1)instr()函式的格式 (俗稱:字元查詢函式) 格式一:instr( string1, string2 ) / instr(源字串, 目標字串) 格式二:instr( string1, string2 [, start_po
Spring註解詳解(轉載)
概述 註釋配置相對於 XML 配置具有很多的優勢: 它可以充分利用 Java 的反射機制獲取類結構資訊,這些資訊可以有效減少配置的工作。如使用 JPA 註釋配置 ORM 對映時,我們就不需要指定 PO 的屬性名、型別等資訊,如果關係表字段和 PO 屬性名、型別都一致,
bootloader詳解(轉載)
一。bootloader介紹 bootloader是硬體在加電開機後,除BIOS固化程式外最先執行的軟體,負責載入真正的作業系統,可以理解為一個超小型的os。目前在Linux平臺中主要有lilo、grub等,在Windows平臺上主要有ntldr、bootmgr、grldr
訊息中介軟體詳解(轉載)
轉載自 : https://blog.csdn.net/leexide/article/details/80035462 1 訊息中介軟體概述 訊息佇列已經逐漸成為企業IT系統內部通訊的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能,成為非同步R
MySQL的Limit詳解(轉載) MySQL的Limit詳解
MySQL的Limit詳解 問題:資料庫查詢語句,如何只返回一部分資料? Top子句 TOP 子句用於規定要返回的記錄的數目。對於擁有數千條記錄的大型表來說,TOP 子句是非常有用的。 在SQL Server資料庫中語法為: SELECT
Apache Spark 記憶體管理詳解(轉載)
Spark 作為一個基於記憶體的分散式計算引擎,其記憶體管理模組在整個系統中扮演著非常重要的角色。理解 Spark 記憶體管理的基本原理,有助於更好地開發 Spark 應用程式和進行效能調優。本文旨在梳理出 Spark 記憶體管理的脈絡,拋磚引玉,引出讀者對這個話題的深入探討。本文中闡述的原理基於 Spark