CSUOJ 1945 最簡單的題目 揹包問題

2021-08-01 18:48:54 字數 1080 閱讀 6167

description

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

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

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

2

1 12

1 23

1 2 3

1

23

好吧,這是個揹包問題。

otz,比賽的時候拿貪心做的,跪了。後來看資料的話,發現貪心實際上也差得不是很多,果然貪心是乙個比較好的近似演算法呀。

揹包的思想就是如何選擇一些物品使得最接近平均值,因為兩台機器都是平均值肯定是最好的。

想通了之後,**並不是很長,還是比較好寫的。

#include #include #include using namespace std;

const int maxm=5010;

bool dp[maxm];

int n,mid,arr[1010],sum,ans;

int main(){

ios_base::sync_with_stdio(0);

while(cin>>n){

if(n==1){

cin>>ans;

cout<>arr[i],sum+=arr[i];

mid=(sum>>1);

memset(dp,0,sizeof dp);

dp[0]=true;

for(int i=0;i=arr[i];--j)

if(dp[j-arr[i]])

dp[j]=true;

for(int i=mid;i;--i)

if(dp[i])

ans=i,i=1;

cout<

CSU 1945 最簡單的題目

比賽的時候拿貪心的 改來改去死活y不下來,後來跟人討論一下才得知是個揹包問題,果然自己有關揹包和dp方面的理解不深啊。具體的思路在於對當前問題的求解在於盡量使兩台機器工作的時間相近,這樣才能讓最後結束的機器工作的時間最短。做法的話便是排序後進行列舉,標記數值小於等於時間總和的一半的時間點。inclu...

編寫乙個最簡單的互動式題目

最近無聊學著編了一下互動式型別的題目。平常網上互動式題目的庫檔案原始碼並不多見,在這裡把我寫的乙個題目分享給大家,希望對大家能夠有幫助。題目是乙個經典問題,下面所引用的內容是全部的題目描述 problem famous 誰是名人 問題描述 matrix67所在的小鎮上有n 2 n 1000 個人,它...

最簡單的加密

最簡單的加密 package com.util 類 介面的目的 作用 功能 繼承於何種父類,實現的介面 實現的演算法 使用方法 示例程式.version v1.0 2012 3 22 author xiahui public class encrypt system.out.print 加密 s n...