揹包dp之01揹包變形

2021-08-07 19:56:41 字數 1246 閱讀 2737

一種雙核cpu的兩個核能夠同時的處理任務,現在有n個已知資料量的任務需要交給cpu處理,假設已知cpu的每個核1秒可以處理1kb,每個核同時只能處理一項任務。n個任務可以按照任意順序放入cpu進行處理,現在需要設計乙個方案讓cpu處理完這批任務所需的時間最少,求這個最小的時間。

輸入描述:

輸入包括兩行:

第一行為整數n(1 ≤ n ≤ 50)

第二行為n個整數length[i](1024 ≤ length[i] ≤ 4194304),表示每個任務的長度為length[i]kb,每個數均為1024的倍數。

輸出描述:

輸出乙個整數,表示最少需要處理的時間

輸入5

3072 3072 7168 3072 1024

輸出

完成所有n個任務需要sum時間,放入兩個cpu中執行,假設第乙個cpu處理時間為n1,第二個cpu時間為sum-n1,並假設n1 <= sum/2,sum-n1 >= sum/2,要使處理時間最小,則n1越來越靠近sum/2,最終目標是求max(n1,sum-n1)的最大值。最終也就是將陣列分成兩部分使得兩部分的和的差最小。

差最小就是說兩部分的和最接近,而且和所有數的和sum的一半也是最接近的。假設用sum1表示第一部分的和,sum2表示第二部分的和,sum表示所有數的和,那麼sum1+sum2=sum。假設sum1< sum2 那麼sum/2-sum1 = sum2-sum/2;

所以我們就有目標了,使得sum1<=sum/2的條件下盡可能的大。也就是說從n個數中選出某些數,使得這些數的和盡可能的接近或者等於所有數的和的一半。這其實就是簡單的揹包問題了:

揹包容量是sum/2. 每個物體的體積是數的大小,然後盡可能的裝滿揹包。

#include 

#include

#define n 1024

using

namespace

std;

int max(int a,int b)

int main()

int sum1=sum/2;

vector

dp(sum1,0);

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

}printf("%d\n",(sum-dp[sum1])*n);

return

0;}

揹包dp之01揹包

現在我們有n個配件,他們有不同的價值.但是我們揹包的容量是有限的,因為我們只有乙個一級包,所以我們最多可以裝v重量的東西.但是為了能更好的吃到雞 不存在的 我們要攜帶更有價值的配件,請問我們最多能拿多少價值的配件來當快遞員呢?輸入的第一行是t,表示有一共要打t場比賽.每組資料由三行組成.第一行包含兩...

01揹包dp變形 Robberies

題意 乙個強盜要搶劫銀行又不想被抓到,所以要進行概率分析求他在不被抓的情況下能搶最多的錢。他給定t 樣例個數 n 要搶的銀行的個數 p 被抓的概率要小於p mj 強盜能搶第j個銀行mj元錢 pj 強盜搶第j個銀行被抓的概率為pj 思路 被抓的概率不好直接求出來,但可以直接求出不被抓的概率,則有狀態轉...

01揹包變形

傳送門 現有n個物品,序號分別為1,2,n。對於每個i 1 i n 物品i有乙個體積wi和乙個價值vi。小明想在這n個物品中選取一些放到揹包裡帶回家。已知揹包的容積為w,這意味著所帶物品的總體積不能超過w。求出小明可以帶回家的物品總價值可能的最大值。constraints input 標準輸入格式如...