題意:
給你 n 張卡片,總共可以消耗的法力值,求最多可以造成多少傷害, 卡片分為2種,一種是魔法卡,使用後可以使所有的連環卡的費用全部減1,另一種是連環卡,因魔法卡的使用可以使其費用減1,問最終最多可以造成多少的傷害
思路分析 :
比賽的時候大腦短路了,基本不願意去想東西了,導致題目沒有出來,這個題就是乙個 01揹包,但是增加了乙個限制條件,所以我們多增加一維表示到當前位置,所使用的魔法卡的數量,但是呢,還有乙個很關鍵的地方,就是我們要先對卡片經行乙個排序的預處理,這樣在搞 dp的時候,才不會對後續有任何的影響,排序的時候,優先使用魔法卡,然後兩者都是的卡,剩下的卡就隨意了。
**示例:(未測試)
#define ll long longconst 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了。並且我...