dp 3維揹包(東四省)

2022-06-27 03:45:12 字數 2302 閱讀 9700

題意:

給你 n 張卡片,總共可以消耗的法力值,求最多可以造成多少傷害, 卡片分為2種,一種是魔法卡,使用後可以使所有的連環卡的費用全部減1,另一種是連環卡,因魔法卡的使用可以使其費用減1,問最終最多可以造成多少的傷害

思路分析 :

比賽的時候大腦短路了,基本不願意去想東西了,導致題目沒有出來,這個題就是乙個 01揹包,但是增加了乙個限制條件,所以我們多增加一維表示到當前位置,所使用的魔法卡的數量,但是呢,還有乙個很關鍵的地方,就是我們要先對卡片經行乙個排序的預處理,這樣在搞 dp的時候,才不會對後續有任何的影響,排序的時候,優先使用魔法卡,然後兩者都是的卡,剩下的卡就隨意了。

**示例:(未測試)

#define ll long long

const int maxn = 1e6+5;

const int mod = 1e9+7;

const double eps = 1e-9;

const double pi = acos(-1.0);

const int inf = 0x3f3f3f3f;

int n, w;

struct node

pre[505];

int dp[505][505][505];

int cnt = 0;

bool cmp1(node a, node b)

bool cmp2(node a, node b)

void fun()

else if (pre[i].p1 && pre[i].p2)

else dp[i][j][k] = dp[i-1][j][k];

}else if (!pre[i].p1 && pre[i].p2)

else dp[i][j][k] = dp[i-1][j][k];

}else

else dp[i][j][k] = dp[i-1][j][k];

}//printf("+++%d %d %d = %d \n",i, j, k, dp[i][j][k]);

} }}

}void init()

}for(int i = n; i >= 1; i--)

}if (pos1 != -1) sort(pre+pos1, pre+pos2+1, cmp2);

pos1 = pos2 = -1;

for(int i = 1; i <= n; i++)

}for(int i = n; i >= 1; i--)

}if (pos1 != -1) sort(pre+pos1, pre+pos2+1, cmp2);

pos1 = pos2 = -1;

for(int i = 1; i <= n; i++)

}for(int i = n; i >= 1; i--)

}if (pos1 != -1) sort(pre+pos1, pre+pos2+1, cmp2);

pos1 = pos2 = -1;

for(int i = 1; i <= n; i++)

}for(int i = n; i >= 1; i--)

}if (pos1 != -1) sort(pre+pos1, pre+pos2+1, cmp2);

}int main()

sort(pre+1, pre+1+n, cmp1);

init();

for(int i = 1; i <= n; i++)

memset(dp, 0x8f, sizeof(dp));

for(int j = 0; j <= w; j++)

fun();

int ans = 0;

for(int i = 0; i <= cnt; i++) ans = max(ans, dp[n][w][i]);

printf("%d\n", ans);

return 0;}/*

4 31 3 0 1

1 0 0 0

3 3 1 1

3 4 1 0

3 33 3 1 1

2 3 1 1

1 3 1 1

3 43 10 1 1

30 400 1 1

4 200 1 1

5 56 50 1 1

3 30 0 1

3 3 1 0

3 200 0 0

3 6 1 0

6 41 3 1 0

2 5 0 0

1 2 0 1

2 2 1 1

3 4 0 1

1 1 1 0

*/

揹包問題(一維dp)

揹包問題可謂是經典的動態規劃問題,這裡就給出01揹包,完全揹包,多重揹包的核心內容吧。可以作為模板用哦 見 1 01揹包 w i 代表重量,v i 代表價值,v代表揹包容量 for int i 0 i w i j dp j max dp j w i v i dp j 2 完全揹包 完全揹包跟01揹包...

一維dp陣列01揹包

有n件物品和乙個最多能被重量為w 的揹包。第i件物品的重量是weight i 得到的價值是value i 每件物品只能用一次,求解將哪些物品裝入揹包裡物品價值總和最大。這是標準的揹包問題,以至於很多同學看了這個自然就會想到揹包,甚至都不知道暴力的解法應該怎麼解了。這樣其實是沒有從底向上去思考,而是習...

揹包問題3 二維揹包和分組揹包

有總體積為v,且最大只能放質量為m mm的揹包中,存在n個物品,體積為v iv i vi 價值為w iw i wi 質量為m im i mi 求怎麼放可以得到最大價值。總體來說就是在01揹包的基礎上為物品新增了乙個重量的屬性,還是比較簡單,可以在我們之前的01揹包的 基礎上加一層迴圈就ok了。並且我...