貪心算法---背包問題(物品可以分割問題)

問題背景:

有一天,阿里巴巴趕著一頭毛驢上山砍柴。砍好柴準備下山時,遠處突然出現一股煙塵,彌漫著直向上空飛揚,朝他這兒卷過來,而且越來越近。靠近以后,他才看清原來是一支馬隊,他們共有四十人,一個個年輕力壯、行動敏捷。一個首領模樣的人背負沉重的鞍袋,從叢林中一直來到那個大石頭跟前,喃喃地說道:“芝麻,開門吧!”隨著那個頭目的喊聲,大石頭前突然出現一道寬闊的門路,于是強盜們魚貫而入。阿里巴巴待在樹上觀察他們,直到他們走得無影無蹤之后,才從樹上下來。他大聲喊道:“芝麻,開門吧!”他的喊聲剛落,洞門立刻打開了。他小心翼翼地走了進去,一下子驚呆了,洞中堆滿了財物,還有多得無法計數的金銀珠寶,有的散堆在地上,有的盛在皮袋中。突然看見這么多的金銀財富,阿里巴巴深信這肯定是一個強盜們數代經營、掠奪所
積累起來的寶窟。為了讓鄉親們開開眼界,見識一下這些寶物,他想一種寶物只拿一個,如果太重就用錘子鑿開,但毛驢的運載能力是有限的,怎么才能用驢子運走最大價值的財寶分給窮人呢? 阿里巴巴陷入沉思中……

問題分析:

假設山洞中有 n 種寶物,每種寶物有一定重量 w 和相應的價值 v,毛驢運載能力有限,
只能運走 m 重量的寶物,一種寶物只能拿一樣,寶物可以分割。那么怎么才能使毛驢運走寶物的價值最大呢?
每次選取單位重量價值最大的寶物,也就是說每次選擇性價比(價值/重量)最高的寶物,如果可以達到運載重量 m,那么一定能得到價值最大

算法設計:

(1)數據結構及初始化。將 n 種寶物的重量和價值存儲在結構體 back(包含重量、價
值、性價比 3 個成員)中,同時求出每種寶物的性價比也存儲在對應的結構體 back中,將其按照性價比從高到低排序。采用 sum 來存儲毛驢能夠運走的最大價值,初始化為 0。
(2)根據貪心策略,按照性價比從大到小選取寶物,直到達到毛驢的運載能力。每次選
擇性價比高的物品,判斷是否小于 c(毛驢運載能力),如果小于 c,則放入sum(已放入物品的價值)加上當前寶物的價值,c減去放入寶物的重量;如果不小于 c,則取該寶物的一部分 c* proportion[i],c=0,程序結束。c減少到 0,則 sum 得到最大值。

在性價比排序的基礎上,進行貪心算法運算。如果剩余容量比當前寶物的重量大,則可
以放入,剩余容量減去當前寶物的重量,已放入物品的價值加上當前寶物的價值。如果剩余容量比當前寶物的重量小,表示不可以全部放入,可以切割下來一部分(正好是剩余容量),然后令剩余容量乘以當前物品的單位重量價值,已放入物品的價值加上該價值,即為能放入寶物的最大價值。

測試數據:

輸入:
6 19 //寶物數量,驢子的承載重量
2 8 //第 1 個寶物的重量和價值
6 1 //第 2 個寶物的重量和價值
7 9
4 3
10 2
3 4

輸出:
24.6

代碼如下:

#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;struct back{double weight;//重量double value;//價值double proportion;//性價比
}a[999];bool beyond(back a,back b){return a.proportion >b.proportion;//性價比由大到小排序
}int main()
{int number;//珠寶的種類double sum=0.0;//總價值double c;//驢最大載重量cin>>number>>c;for(int i=0;i<number;i++){//以次輸入數據scanf("%lf",&a[i].weight);scanf("%lf",&a[i].value);a[i].proportion = a[i].value / a[i].weight;}sort(a,a+number,beyond);//按性價比由大到小排序for(int j=0;j<number;j++){if(c>=a[j].weight){//寶物的重量小于或等于驢的載重量c-=a[j].weight;//裝上該寶物之后,驢的剩余載重量sum+=a[j].value;//寶物的價值}else{//寶物的重量大于驢的載重量sum+= c * a[j].proportion;//分割寶物break;}}printf("%.1lf\n",sum);cout<<sum;return 0;
}

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

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

相關文章

同步---信號量

信號量1 信號量2 驅動程序和測試程序3 內核的具體實現總結1 信號量 Linux中的信號量是一種睡眠鎖。如果有一個任務試圖獲得一個已經被占用的信號量時&#xff0c;信號量會將其放到一個等待隊列&#xff0c;然后讓其睡眠&#xff0c;這時處理器去執行其他代碼。當持有信號量的進…

Java Float類floatToIntBits()方法與示例

Float類floatToIntBits()方法 (Float class floatToIntBits() method) floatToIntBits() method is available in java.lang package. floatToIntBits()方法在java.lang包中可用。 floatToIntBits() method follows IEEE 754 floating-point standards and according to standa…

解釋三度帶和六度帶的概念以及各坐標系如何定義

★ 地形圖坐標系&#xff1a;我國的地形圖采用高斯&#xff0d;克呂格平面直角坐標系。在該坐標系中&#xff0c;橫軸&#xff1a;赤道&#xff0c;用&#xff39;表示&#xff1b;縱軸&#xff1a;中央經線&#xff0c;用&#xff38;表示&#xff1b;坐標原點&#xff1a;中央…

0-1背包問題(物品不可分割)

問題背景&#xff1a; 所謂“鐘點秘書”&#xff0c;是指年輕白領女性利用工余時間為客戶提供秘書服務&#xff0c;并按鐘點收取酬金。“鐘點秘書”為客戶提供有償服務的方式一般是&#xff1a;采用電話、電傳、上網等“遙控”式 服務&#xff0c;或親自到客戶公司處理部分業務…

算法---KMP算法

字符串1 KMP算法狀態機概述構建狀態轉移1 KMP算法 原文鏈接&#xff1a;https://zhuanlan.zhihu.com/p/83334559 先約定&#xff0c;本文用pat表示模式串&#xff0c;長度為M&#xff0c;txt表示文本串&#xff0c;長度為N&#xff0c;KMP算法是在txt中查找子串pat&#xff0…

cache初接觸,并利用了DataView

我們在寫代碼的時候,如果數據控件要獲得數據,一般方法,Conn.Open();OleDbCommand cmd;cmd new OleDbCommand(sql, Conn);GridView1.DataSource dbcenter.accessGetDataSet(sql);GridView1.DataBind();Conn.close();但如果多個數據控件要綁定數據,則比較頻繁打開數據庫,效率一…

Java ByteArrayInputStream reset()方法及示例

ByteArrayInputStream類reset()方法 (ByteArrayInputStream Class reset() method) reset() method is available in java.util package. reset()方法在java.util包中可用。 reset() method is used to reset this ByteArrayInputStream to the last time marked position and …

回文數猜想

問題描述&#xff1a; 一個正整數&#xff0c;如果從左向右讀&#xff08;稱之為正序數&#xff09;和從右向左讀&#xff08;稱之為倒序數&#xff09;是一樣的&#xff0c;這樣的數就叫回文數。任取一個正整數&#xff0c;如果不是回文數&#xff0c;將該數與他的倒序數相加…

文件上傳 帶進度條(多種風格)

文件上傳 帶進度條 多種風格 非常漂亮&#xff01; 友好的提示 以及上傳驗證&#xff01; 部分代碼&#xff1a; <form id"form1" runat"server"><asp:ScriptManager ID"scriptManager" runat"server" EnablePageMethods&quo…

同步---自旋鎖

1 自旋鎖的基本概念 自旋鎖最多只能被一個可執行線程持有&#xff0c;如果一個執行線程試圖獲得一個已經被使用的自旋鎖&#xff0c;那么該線程就會一直進行自旋&#xff0c;等待鎖重新可用。在任何時刻&#xff0c;自旋鎖都可以防止多余一個的執行線程同時進入臨界區。 Linu…

實習日志----4.播放時段參數設置

由于客戶在下發廣告時&#xff0c;一則廣告可在多個時段播放&#xff0c;這就需要設置多個播放時段的參數。 但在這種情況下&#xff0c;我并不知道用戶每次需要下發幾個時段&#xff0c;所以前臺不能設定死。 因此我要實現這么一個功能&#xff0c;讓用戶根據自己的需要來動態…

線性插值算法實現圖像_C程序實現插值搜索算法

線性插值算法實現圖像Problem: 問題&#xff1a; We are given an array arr[] with n elements and an element x to be searched amongst the elements of the array. 給定一個數組arr []&#xff0c;其中包含n個元素和一個要在該數組的元素中搜索的元素x 。 Solution: 解&…

hdu 1197

地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1197 題意&#xff1a;求一個數轉換成10&#xff0c;12&#xff0c;16進制后各個位上的數的和是否相等。 mark&#xff1a;模擬進制轉換。 代碼&#xff1a; #include <stdio.h>int zh(int a, int n) {int su…

linux系統編程---線程總結

線程總結1 線程的實現線程創建線程退出線程等待線程清理2 線程的屬性線程的分離線程的棧地址線程棧大小線程的調度策略線程優先級3 線程的同步互斥鎖讀寫鎖條件變量信號量線程是系統獨立調度和分配的基本單位。同一進程中的多個線程將共享該進程中的全部系統資源&#xff0c;例…

博客上一些項目相關源碼鏈接

GitHub&#xff1a;https://github.com/beyondyanyu/Sayingyy

重新開啟Ctrl+Alt+Backspace快捷鍵

UBUNTU老用戶知道CtrlAltBackspace這個快捷鍵是用來快速重啟X的在9.04中被默認關閉了&#xff0c;那如何來打開它呢&#xff1f;在終端中輸入&#xff1a;sudo gedit /etc/X11/xorg.conf在其中加入&#xff1a;Section “ServerFlags”Option “DontZap” “false”EndSection退…

Java LocalDate類| 帶示例的getDayOfYear()方法

LocalDate類的getDayOfYear()方法 (LocalDate Class getDayOfYear() method) getDayOfYear() method is available in java.time package. getDayOfYear()方法在java.time包中可用。 getDayOfYear() method is used to get the day-of-year field value of this LocalDate obje…

火腿三明治定理

定理&#xff1a;任意給定一個火腿三明治&#xff0c;總有一刀能把它切開&#xff0c;使得火腿、奶酪和面包片恰好都被分成兩等份。 而且更有趣的是&#xff0c;這個定理的名字真的就叫做“火腿三明治定理”&#xff08;ham sandwich theorem&#xff09;。它是由數學家亞瑟?斯…

如何給Linux操作系統(CentOS 7為例)云服務器配置環境等一系列東西

1.首先&#xff0c;你得去購買一個云服務器&#xff08;這里以阿里云學生服務器為例&#xff0c;學生必須實名認證&#xff09; 打開阿里云&#xff0c;搜索學生服務器點擊進入即可 公網ip為連接云服務器的主機 自定義密碼為連接云服務器是需要輸入的密碼 購買即可 點擊云服…

Linux系統編程---I/O多路復用

文章目錄1 什么是IO多路復用2 解決什么問題說在前面I/O模型阻塞I/O非阻塞I/OIO多路復用信號驅動IO異步IO3 目前有哪些IO多路復用的方案解決方案總覽常見軟件的IO多路復用方案4 具體怎么用selectpollepolllevel-triggered and edge-triggered狀態變化通知(edge-triggered)模式下…