The Fewest Coins (混合揹包)

2021-09-25 19:27:20 字數 1761 閱讀 8746

有的物品只可以取一次或不取(基本的0-1揹包),有的物品可以取無限次(完全揹包),有的物品可以取的次數有乙個上限(多重揹包),就是混合揹包問題。

題意:農夫john到城裡去買一些農具。john是乙個非常有效率的人,他總是以這樣一種方式來買他的貨物:最少數量的硬幣易手,也就是他用來支付的硬幣的數量加上他收到的找零的硬幣數量要最小化。請您幫助他確定這個最小值是多少。

農夫john想購買t (1≤t≤10,000)美分的商品。貨幣體系有n (1 ≤ n ≤ 100)種不同的硬幣,其面值為v1, v2, …, vn (1 ≤ vi ≤ 120)。農夫john有面值為v1的硬幣 c1枚,面值為 v2的硬幣c2枚,…,麵價為vn的硬幣cn 枚(0 ≤ ci ≤ 10,000)。店主則擁有所有的硬幣無限枚,並且總是以最有效的方式進行找零(儘管農夫john必須確保以能夠進行正確的找零方式付款)。

輸入第一行:兩個用空格分隔的整數n和t;

第二行:n個用空格分隔的整數,分別為v1, v2, …, vn;

第三行:n個用空格分隔的整數,分別為 c1, c2, …, cn。

輸出輸出1行,給出乙個整數,在支付和找零中使用硬幣的最小數。如果農夫john支付和接收準確的找零是不可能的,輸出-1。

題解首先用完全揹包預處理找零j的時候最少需要多少硬幣,然後用多重揹包處理付款j的時候最少需要多少銀幣,最後將兩個加起來就行,求最小值。

#include

#include

#include

#include

using namespace std;

const

int inf=

0x3f3f3f3f

;//約翰對不同金額所付的最少硬幣數量

int dp1[

25000];

//店長對不同金額所付的最少硬幣數量

int dp2[

25000];

int v[

105]

,w[105];

//完全揹包

void

com(

int w,

int sum)

//多重揹包

void

mul(

int v,

int w,

int sum)

else

for(

int i=sum;i>=v*w;i--

) dp1[i]

=min

(dp1[i]

,dp1[i-v*w]

+v);}}

intmain()

for(

int i=

0;i)scanf

("%d"

,&v[i]);

sum=sum*sum+t+1;

memset

(dp1,inf,

sizeof

(dp1));

memset

(dp2,inf,

sizeof

(dp2));

dp1[0]

=0;dp2[0]

=0;for

(int i=

0;i)int res=inf;

for(

int i=t;i<=sum;i++

) res=

min(res,dp1[i]

+dp2[i-t]);

if(res==inf)

cout<<-1

cout

}

混訪混掛遷移示例

編輯我的收藏 本頁目錄 本文件介紹了如何使用混掛和混訪方案將經典網路遷移至專有網路。在開始使用混掛和混訪遷移方案前,請確保滿足以下條件 本文件提供兩個遷移示例,其中乙個待遷移的系統相對複雜。準備網路環境。首先,需要建立專有網路和交換機,確定要遷移的專有網路和交換機的相關資訊。詳情參考搭建ipv4專有...

混圈子的人

因為已經簽下華為offer,也算是半隻腳踏入程式設計師的門檻中,那麼對於乙個將要混程式設計師圈子的人,我應該做些什麼,或者說應該養成怎樣的習慣?重要的寫在前面 思考,程式設計,思考,程式設計.每天必逛 github stackover 優秀blog 維基百科 一些開源社群 專案 個人主頁 有乙個自己...

python 易混地帶

每門程式語言都有易混淆的部分,下面列舉出一些python的易混淆知識點。和 is 的區別在python中,操作符測試值的相等性 is 表示式測試物件的一致性,即是否指向同乙個物件。list1 1,a 3 list2 1,a 3 list1 list2,list1 is list2 true,fals...