1. 程式人生 > >BZOJ_4004_[JLOI2015]裝備購買_線性基

BZOJ_4004_[JLOI2015]裝備購買_線性基

並且 否則 最優化 put des pac 每次 想要 自然

BZOJ_4004_[JLOI2015]裝備購買_線性基

Description

臉哥最近在玩一款神奇的遊戲,這個遊戲裏有 n 件裝備,每件裝備有 m 個屬性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j <= m),每個裝備需要花費 ci,現在臉哥想買一些裝備,但是臉哥很窮,所以總是盤算著 怎樣才能花盡量少的錢買盡量多的裝備。對於臉哥來說,如果一件裝備的屬性能用購買的其他裝備組合出(也就是 說臉哥可以利用手上的這些裝備組合出這件裝備的效果),那麽這件裝備就沒有買的必要了。嚴格的定義是,如果 臉哥買了 zi1,.....zip這 p 件裝備,那麽對於任意待決定的 zh,不存在 b1,....,bp 使得 b1zi1 + ... + bpzi p = zh(b 是實數),那麽臉哥就會買 zh,否則 zh 對臉哥就是無用的了,自然不必購買。舉個例子,z1 =(1; 2; 3);z2 =(3; 4; 5);zh =(2; 3; 4),b1 =1/2,b2 =1/2,就有 b1z1 + b2z2 = zh,那麽如果臉哥買了 z1 和 z2 就不會再買 zh 了。臉哥想要在買下最多數量的裝備的情況下花最少的錢,你能幫他算一下嗎?

Input

第一行兩個數 n;m。接下來 n 行,每行 m 個數,其中第 i 行描述裝備 i 的各項屬性值。接下來一行 n 個數, 其中 ci 表示購買第 i 件裝備的花費。

Output

一行兩個數,第一個數表示能夠購買的最多裝備數量,第二個數表示在購買最多數量的裝備的情況下的最小花費

Sample Input

3 3
1 2 3
3 4 5
2 3 4
1 1 2

Sample Output

2 2

HINT

如題目中描述,選擇裝備 1 裝備 2,裝備 1 裝備 3,裝備 2 裝備 3 均可,但選擇裝備 1 和裝備 2 的花費最小,為 2。對於 100% 的數據, 1 <= n;m <= 500; 0 <= aj <= 1000。
線性基是擬陣,擬陣最優化問題使用貪心。 高斯消元一遍,每次把這一項的系數不是0並且花錢數最少的裝備拿出來消去其他項。 可以證明最後的結果一定是最優的。 代碼:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define eps 1e-6
typedef long double f2;
int n,m;
f2 a[510][510];
f2 fabs(f2 x){return x>0?x:-x;}
void Gauss() {
    int i,j,k,mx;
    f2 ans=0;
    int cnt=0;
    for(i=1;i<=m;i++) {
        mx=0;
        for(j=i;j<=n;j++) {
            if(fabs(a[j][i])>eps) {
                if(!mx) mx=j;
                else if(a[j][m+1]<a[mx][m+1]) mx=j;
            }
        }
        if(!mx) continue;
        ans+=a[mx][m+1]; cnt++;
        for(j=i;j<=m+1;j++) swap(a[i][j],a[mx][j]);
        for(j=i+1;j<=n;j++) {
            f2 tmp=-(a[j][i]/a[i][i]);
            a[j][i]=0;
            for(k=i+1;k<=m;k++) a[j][k]+=tmp*a[i][k];
        }
    }
    printf("%d %.0Lf\n",cnt,ans);
}
int main() {
    scanf("%d%d",&n,&m);
    int i,j;
    for(i=1;i<=n;i++) {
        for(j=1;j<=m;j++) {
            scanf("%Lf",&a[i][j]);
        }
    }
    for(i=1;i<=n;i++) scanf("%Lf",&a[i][m+1]);
    Gauss();
}

BZOJ_4004_[JLOI2015]裝備購買_線性基