hdu 4341(分組揹包(好題))

2021-06-17 18:44:17 字數 774 閱讀 3379

分組揹包問題, 由於一條直線上的要按照順序取, 如果一條直線上有n個金礦, 對於這條直線則有n + 1 種決策, 而且是互相矛盾的, 所以可以將這n個物品重新組合一下, 轉化成乙個分組揹包問題, 詳見**。。。

#include #include #include #include #include #include #include #include using namespace std;

const int n = 205;

struct point

};point pts[n];

bool flag[n];

vectorgroup[n];

int dp[40005];

int main()

g++;

} for (int i = 0; i < g; i++)

} fill(dp, dp + w + 1, 0);

for (int i = 0; i < g; i++)

for (int j = w; j >= 0; j--)

for (int k = 0; k < group[i].size(); k++)

if (j - group[i][k].t >= 0)

dp[j] = max(dp[j], dp[j - group[i][k].t] + group[i][k].v);

printf("case %d: %d\n", cas++, dp[w]);

} return 0;

}

hdu4341 Gold miner 分組揹包dp

題意 和 礦工差不多。人在 0,0 有n種金,遊戲時間為t。告訴你每種金的位置 x,y 獲得該金需要的時間的t,以及它的 價值。且若人和多塊金子共線時,只能先取最近的金子。問在遊戲時間內可獲得最大價值。思路 對於共線的金,我們將其分為一組,並按照距 0,0 的距離排序,那麼選該點的價值為前面所有的價...

HDU 4341 Gold miner 分組揹包

這裡有多個點與原點的連線共線的話,那麼需要對其進行並組,將前乙個作為單獨的乙個,把前兩個作為單獨的乙個.最後直接分組揹包就可以了。如下 include include include include define maxn 205 using namespace std intn,m,cnt max...

HDU 4341 Gold miner(分組揹包)

題目鏈結 gold miner 目標是要在規定時間內獲得的價值總和要盡可能大。我們先用並查集把斜率相同的物品分在同乙個組。這些組裡的物品按照y座標的大小公升序排序。如果組內的乙個物品被選取了,那該組排在他前面的所有物品肯定被選取了。那麼我們對每個組的所有物品,對價值和代價分別求字首和。那麼選了3號,...