傳送門biu~
當n-k>=16時,每一位上的1都可以出現,只需要考慮每位是否有1即可。
剩下的情況n最大只有115(資料範圍瞬間變得友善了)。
令f[state]代表組合出state最少需要多少個數,跑揹包即可。然後再將f[state]更新成組合出包含state這個集合的數最少需要多少個數,列舉每個狀態的子集從大到小更新即可。
計算答案時,從高位到低位貪心,只要f[state]<=n-k,即說明state狀態合法。
#include
#define n 100010
using
namespace
std;
int n,k,ans,a[n],f[n<<1];
int main()}}
printf("%d",ans);
return
0; }
memset(f,0x3f,sizeof f);
f[0]=0;
for(int i=1;i<=n;++i)
}for(int i=(1
<<17)-1;~i;--i)
}for(int i=(1
<<16);i;i>>=1)
printf("%d",ans);
return
0;}
bzoj4976寶石鑲嵌 DP
description 魔法師小q擁有n個寶石,每個寶石的魔力依次為w 1,w 2,w n。他想把這些寶石鑲嵌到自己的法杖上,來提公升 法杖的威力。不幸的是,小q的法杖上寶石鑲嵌欄太少了,他必須扔掉k個寶石才能將剩下的寶石鑲嵌上去。法杖的 威力等於鑲嵌在上面的所有寶石的魔力按位做或 or 運算的結果...
bzoj 4976 寶石鑲嵌 動態規劃
魔法師小q擁有n個寶石,每個寶石的魔力依次為w 1,w 2,w n。他想把這些寶石鑲嵌到自己的法杖上,來提公升法杖的威力。不幸的是,小q的法杖上寶石鑲嵌欄太少了,他必須扔掉k個寶石才能將剩下的寶石鑲嵌上去。法杖的威力等於鑲嵌在上面的所有寶石的魔力按位做或 or 運算的結果,請寫乙個程式幫助小q做出最...
bzoj4976 寶石鑲嵌 亂搞 dp
題目描述 從 n 個數中選出 n k 個,使得它們的二進位制或 or 最大。輸出這個值。輸入第一行包含兩個正整數 n,k 2 le n le 100000,1 le k le 100,k第二行包含 n 個整數 w 1,w 2,w n 0 le w i le 100000 分別表示每個寶石的魔力。輸出...