bzoj1061 線性規劃

2021-07-26 13:46:27 字數 1549 閱讀 9057

線性規劃裸題。。。

根據題目很容易可以得到線性規劃方程(以樣例為例):

min(2*x1+5*x2+2*x3)

x1+ 0+ 0>=2

x1+x2+ 0>=3

0+x2+x3>=4

x1,x2,x3>=0

再將方程對偶,得到:

max(2*x1+3*x2+4*x3)

x1+x2+ 0<=2

0+x2+x3<=5

0+ 0+x3<=2

x1,x2,x3>=0

這就是線性規劃的標準型了。

為了方便單純型演算法,加入變數x4,x5,x6:

max(2*x1+3*x2+4*x3)

x4+x1+x2+ 0=2

x5+ 0+x2+x3=5

x6+ 0+ 0+x3=2

x1,x2,x3,x4,x5,x6>=0

這就是鬆弛型。顯然此時最優解不變。

將鬆弛型寫成矩陣的形式:

x1 x2 x3

x4  1  1  0  2

x5  0  1  1  5

x6  0  1  1  2

2   3  4  0(k)

當x1,x2,x3取0時,顯然滿足條件,此時答案為右下角的常數k

我們只需不斷增大k,當k達到最大值時最優解就是k了。

那麼怎麼增大k呢?顯然如果我們增大x1,答案會更優。

但x1不能無限制地增大,對於前3個方程,我們得到x1的限制:

1、x1<=2

2、x1無限制

3、x1無限制

我們選擇最緊的乙個限制1,將x1增大到它,再交換x1,x4。

交換之後再將某些係數改變,使其滿足方程就可以了。

於是我們可以不斷交換,直到矩陣最後一行的係數都不為正就可以了。最優解就是k。

具體看**。

1 #include2 #include3 #include4 #include5

using

namespace

std;

6#define n 1001

7#define m 10001

8#define db double

9#define eps 1e-7

10#define inf 0x3f3f3f3f3f3f3f3f

11db a[m][n],c[n],b[m],ans,tmp;

12int

i,j,n,m,l,r,x;

13 inline void pivot(int x,int y)

23 ans+=c[y]*b[x];

24for(int i=1;i<=n;i++)if(i!=y)c[i]-=c[y]*a[x][i];

25 c[y]*=-a[x][y];26}

27inline db ******x()37}

38int

main()

3946 printf("

%d",(int)(******x()+0.5

));47 }

bzoj1061

單純形求解線性規劃 BZOJ1061

推薦一篇 我們設xi為第i個志願者的招募次數,以樣例為例,則不難列出如下的線性規劃方程 minx1 0 0 2 x1 x2 0 3 0 x2 x3 4 那麼,根據 這個方程等價於 maxx1 x2 0 2 0 x2 x3 5 0 0 x3 2 我們發現,這是乙個線性規劃方程的基本形式,基本解為 然後...

bzoj 1283 線性規劃

time limit 10 sec memory limit 162 mb submit 200 solved 114 submit status discuss 給出乙個長度為 的正整數序列ci,求乙個子串行,使得原序列中任意長度為 的子串中被選出的元素不超過k k,m 100 個,並且選出的元素...

bzoj 1061 志願者招募

明顯的線性規劃網路流,據說當時考場上就1個人a了?a i j 表示第i種志願者第j天是否工作 p i 表示第i種志願者的人數 sigma a i x p i need x 補充函式y i 則sigma a i x p i need x y x 差分,start i 表示第i種志願者開始工作的時間,e...