線性規劃裸題。。。
根據題目很容易可以得到線性規劃方程(以樣例為例):
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 #include5bzoj1061using
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
推薦一篇 我們設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...