01揹包問題(動態規劃)

2021-10-04 22:26:33 字數 3200 閱讀 5725

題目描述

pipi有一台膝上型電腦,一台台式電腦電腦,兩台電腦的效能相同,現在小明手裡有n個等待執行的程式,每個程式執行所需的時間分別為n1,n2,n3,n4……,一台電腦同一時刻只能執行乙個程式,乙個程式只需要執行一次。兩台電腦同時開始執行,請問小明該如何分配程式在這兩台電腦上執行,使得最後結束執行的電腦的執行時間最短。

輸入

輸入不超過30組資料,每組資料第一行為n,代表有n個等待執行的程式,第二行為n個數字,代表每個程式的執行時間,1 <= n <= 1000 ,每個程式的執行時間均為正整數, 所有程式的執行時間之和不超過5000。

輸出

輸出最後結束執行的電腦的執行時間。

樣例輸入2

1 12

1 23

1 2 3

樣例輸出1

23貪心不行,是01揹包問題

即只有一台電腦時依次執行需要執行的時間的一半,最多可以執行多長

總數減去一半最多耗時,即答案,另一台電腦需要的最長時間

01揹包問題

#include

#include

#include

#include

using namespace std;

int n;

int arr[

1005];

int sum,mid;

int dp[

1005][

2510];

intmain()

dp[0]

[0]=

0;mid=sum/2;

for(i=

1;i<=mid;i++

)dp[0]

[i]=0;

for(i=

1;i<=n;i++

)for

(j=1

;j<=mid;j++)if

(j) dp[i]

[j]=dp[i-1]

[j];

else dp[i]

[j]=

max(dp[i-1]

[j],dp[i-1]

[j-arr[i]

]+arr[i]);

printf

("%d\n"

,sum-dp[n]

[mid]);

}//while

return0;

}

#include

#include

#include

#include

using namespace std;

int a[

1005

],dp[

5005];

intmain()

}}

1076: 飯卡

題目描述

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

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

輸入

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

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

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

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

輸出

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

樣例輸入1

505101 2 3 2 1 1 2 3 2 1

50樣例輸出

-4532把最貴的菜留五塊錢最後買即可使餘額最少

即轉化為money-5的從1到n-1中選擇的01揹包問題

要注意的是,如果money<5,則直接輸出money(因為什麼也買不了ovo)

#include

#include

#include

#include

#include

using namespace std;

intcmp

(const

void

*a,const

void

*b)int n;

int cost[

1005];

int dp[

1005][

1005];

int money;

intmain()

qsort

(cost+

1,n,

sizeof

(int

),cmp)

; money-=5

;for

(i=0

;i) dp[i][0

]=0;

for(i=

1;i<=money;i++

)dp[0]

[i]=0;

for(i=

1;i)for

(j=1

;j<=money;j++)if

(j) dp[i]

[j]=dp[i-1]

[j];

else dp[i]

[j]=

max(dp[i-1]

[j],dp[i-1]

[j-cost[i]

]+cost[i]);

printf

("%d\n"

,money+

5-dp[n-1]

[money]

-cost[n]);

}return0;

}

1079

#include

#include

int n,m,val[

500]

,wei[

500]

;int dp[

10005];

intmain()

return0;

}

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...

動態規劃 揹包問題 01揹包

有n種物品和乙個容量為v的揹包,每種物品僅用一次。第i件物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使價值總和最大。例如 n 5,v 10 重量 價值 第乙個物品 10 5 第二個物品 1 4 第三個物品 2 3 第四個物品 3 2 第五個物品 4 1 首先我們考慮貪心策略,選取最大價...

0 1揹包問題(動態規劃)

一 問題描述 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。二 解決方案 考慮使用動態規劃求解,定義乙個遞迴式 opt i v 表示前i個物品,在揹包容量大小為v的情況下,最...