Codevs 1959 拔河比賽

2022-05-13 23:23:28 字數 872 閱讀 6027

有兩種做法:

第一種:dp;不過這個dp比較難想,而且比較特別,,解釋見**注釋。

#include

#include

#include

#include

using

namespace

std;

int n,sum,k,a[105];

bool f[105][45005];

int main()

printf("%d %d",min(ans,sum-ans),max(ans,sum-ans));

return

0;

}

第二種:隨機+貪心

我們把w陣列各元素的位置隨機交換一下,取前面的n/2個為其中一組,不斷更新答案。

#include

#include

#include

#include

#include

using namespace std;

int n,a[109],sum,ans,delta=45009;

int main()

int s1=0;

for(int j=1;j<=n/2;j++) s1+=a[j];

int s2=sum-s1;

if(abs(s1-s2)abs(s1-s2);

}printf("%d

%d",ans,sum-ans);

return

0;}

備註 : 貪心 50,dfs 5

CODEVS 1959 拔河比賽

原題鏈結 看臉的時候到了 隨機化!重複!dp的flag倒下了!夏天沒有西瓜!總之有非常看臉的隨機做法 也有非常靠譜的dp做法 dp是bool型 判斷前i個人裡選j個能不能達到k 隨機化 include include include include include include include i...

codevs1959 拔河比賽

題目大意 給定乙個有 n 個數的集合,將這 n 個數均分成兩堆,求差值最小是多少。題解 有關集合選數的問題,應該是揹包問題,同時要求均分可知,選出的物品數目也應該是揹包費用的乙個維度,因此這是乙個多維費用揹包問題。設狀態 dp i j k 表示考慮了前 i 個數字,已經選了 j 個數字,數字之和為 ...

拔河比賽 CODEVS1959 解題報告

題面 將n個數分成兩部分,使其個數之差不超過1,且兩部分和之差最小。n 100,思路 由於觀察到ai很小,所以很容易就想到的乙個思路是以數的大小和個數作二維費用布林揹包,求其當個數為n 1時最接近的解。這是我很早就想到了的,但這道題還是做了很久,因為算下時間複雜度的話可以發現是 所以我就想呀想,想呀...