1. 程式人生 > >01揹包問題詳解(轉載)

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