codevs1959 拔河比賽

2022-05-20 14:03:14 字數 497 閱讀 2978

題目大意:給定乙個有 n 個數的集合,將這 n 個數均分成兩堆,求差值最小是多少。

題解:有關集合選數的問題,應該是揹包問題,同時要求均分可知,選出的物品數目也應該是揹包費用的乙個維度,因此這是乙個多維費用揹包問題。設狀態 \(dp[i][j][k]\) 表示考慮了前 i 個數字,已經選了 j 個數字,數字之和為 k 的情況是否可行,可知狀態轉移方程為 \(dp[i][j][k]|=dp[i-1][j-1][k-w[i]]|dp[i-1][j][k]\)。最後進行滾動陣列優化即可。

**如下

#include using namespace std;

int n,w[110],sum,dp[60][45000];

void read_and_parse()

void solve()

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

}int main()

CODEVS 1959 拔河比賽

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

Codevs 1959 拔河比賽

有兩種做法 第一種 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 a...

拔河比賽 CODEVS1959 解題報告

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