CODEVS 1959 拔河比賽

2021-08-05 23:58:58 字數 1451 閱讀 3325

原題鏈結

看臉的時候到了☆

隨機化!

重複!

dp的flag倒下了!

夏天沒有西瓜!

總之有非常看臉的隨機做法

也有非常靠譜的dp做法

dp是bool型

判斷前i個人裡選j個能不能達到k

隨機化

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define mod 1000000007

#define pi 3.141592653589

using

namespace

std;

int sum1,sum2=99999999,w[105],n;

void randnum()

}void getans()

else

}if(ans1>ans2) swap(ans1,ans2);

if(abs(ans1-ans2)}int main()

printf("%d %d",sum1,sum2);

return

0;}

dp

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define mod 1000000007

#define pi 3.141592653589

using

namespace

std;

int n,i,w[105],s,p,dp[105][45005],k,j,ans1,ans2;

int main()

p=(n+1)/2;

dp[0][0]=1;

dp[1][0]=1;

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

for(j=p;j>=0;j--)

for(k=s/2;k>=0;k--)

if(dp[j][k]) dp[j+1][k+w[i]]=1;

for(i=s/2;i>=1;i--)

if(dp[p][i])

ans2=s-ans1;

printf("%d %d",min(ans1,ans2),max(ans1,ans2));

return

0;}

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

拔河比賽 CODEVS1959 解題報告

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