分組揹包問題, 由於一條直線上的要按照順序取, 如果一條直線上有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號,...