DAG 揹包九解 01揹包

2022-05-03 08:21:11 字數 1402 閱讀 3910

飯卡:

電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買乙個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購買(即使金額足夠)。所以大家都希望盡量使卡上的餘額最少。 

某天,食堂中有n種菜**,每種菜可購買一次。已知每種菜的**以及卡上的餘額,問最少可使卡上的餘額為多少。 

input多組資料。對於每組資料: 

第一行為正整數n,表示菜的數量。n<=1000。 

第二行包括n個正整數,表示每種菜的**。**不超過50。 

第三行包括乙個正整數m,表示卡上的餘額。m<=1000。 

n=0表示資料結束。 

output對於每組輸入,輸出一行,包含乙個整數,表示卡上可能的最小餘額。sample input

1505

101 2 3 2 1 1 2 3 2 1

500

sample output

-45

32

#include #include

#include

using

namespace

std;

int cmp(int a,int b)

intmain()

,dp[2013] = ;

for(i = 1; i<=n; i++)

scanf("%d

",&price[i]);

sort(price+1,price+1+n,cmp);

int max=price[n];

intj,m;

scanf("%d

",&m);

if(m<5)//

低於5元不能購買

m-=5;//

取出5元用於購買最貴的物品

for(int i = 1; i//

01揹包

}printf(

"%d\n

",m+5-dp[m]-max);

}return0;

}

#include#define n 1010#include

#include

#include

intpri[n];

intm,n;

intdp[n];

using

namespace

std;

intmain()

scanf("%d

",&m);

sort(pri+1,pri+n+1

);

if(m<5

)

for(int i=1;i)

}printf(

"%d\n

",m-dp[m-5]-pri[n]);

}}

揹包九講之 01揹包

01揹包是最基礎的揹包問題,其中01代表的就是第i個物品的選或不選,在此先設v i 為體積,w i 為價值。很顯然,我們可以使用二位陣列dp i j 來表示前i個物品在揹包容量為j的時候可存放的最大價值。首先dp 0 0 0是很顯然的。而計算dp i j 時,存在01兩種情況 選或不選第i件物品。1...

揹包九講 01揹包問題

1 01揹包問題描述 已知 有 n 件物品和乙個容量為 v 的揹包。第i件物品的重量為w i 得到的價值是 c i 問題 求解將哪些物品裝入揹包可使價值總和最大。條件 每種物品只有一件,可以選擇放或者不放 2 基本思路 01揹包的特點 每種物品只有一件,可以選擇放或者不放 子問題定義狀態f i v ...

揹包九講專題 01揹包

樸素2維無優化寫法 includeusing namespace std const int maxn 1e3 5 int dp maxn maxn v maxn w maxn intmain printf d n dp n m view code 優化1維寫法 關於優化是怎麼來的?首先為什麼第二個...