日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[haut] 1281: 邪能炸弹 dp

發布時間:2023/12/16 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [haut] 1281: 邪能炸弹 dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

正在入侵艾澤拉斯的古爾丹偶然間得到了一顆邪能炸彈,經過研究,他發現這是一顆威力極其巨大且難以控制的炸彈。但是精通邪能的古爾丹突然有了一個大膽的想法,他對炸彈進行了一些小小的改造。這使得炸彈需要n天的充能才能爆炸,在這n天中,每天炸彈的邪能值都會產生波動,波動值為xi,古爾丹唯一能控制的是使邪能值增加xi或減少xi,如果邪能值小于0或大于MAX,那么炸彈將會損壞并失效。機智如古爾丹當然會做出最優選擇。而作為反抗軍的情報人員,你知道炸彈的初始邪能值為begin,壽命為n天以及每天的波動值xi。你需要知道在第n天炸彈可能達到的最大邪能值。

輸入

第一行為一個整數T,表示有T組測試實例。
對于測試實例:
第一行為三個整數 n,begin,MAX。1<=n<=50,0<=begin<=MAX,1<=MAX<=1000。
第二行一次為n個整數 x1,x2,x3,x4...xn。1<=xi<=1000

輸出

對于每組測試實例輸出一行,表示第n天炸彈可能達到的最大邪能值,如果炸彈無法避免邪能值低于0或者高于MAX則輸出-1。

樣例輸入

2 3 5 10 5 3 73 3 8 5 2 10

樣例輸出

10 -1

思路:當時的寫的是dfs ac了 可以構造一顆搜索樹 然后搜索就好了
   題解是用的dp 設dp[i][j]為第i天時值為j的存在狀態 1為存在 0為不存在 如果dp[i-1][j] = 1 那么可由此推出dp[i][j + Xi] 和 dp[i][j - Xi]的存在狀態
   若j在i-1和i階段取值0~Max內都不存在的話 直接可以返回-1了
dfs:
#include <iostream> #include <stdio.h> #include <queue> using namespace std; int a[1010]; int n, b, Max; int ans;void dfs(int ret, int t) {if (ret < 0 || ret > Max)return;if (t == n) {ans = max(ans, ret);return;}dfs(ret+a[t], t+1);dfs(ret-a[t], t+1); }int main() {//freopen("1.txt", "r", stdin);int T;scanf("%d", &T);while (T--) {ans = -1;scanf("%d%d%d", &n, &b, &Max);for (int i = 0; i < n; i++)scanf("%d", &a[i]);dfs(b, 0);printf("%d\n", ans);}return 0; } dp:
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> using namespace std; int dp[55][1010]; int n, b, Max; int x[55];int main() {//freopen("1.txt", "r", stdin);int T;scanf("%d", &T);while (T--) {scanf("%d%d%d", &n, &b, &Max);for (int i = 1; i <= n; i++)scanf("%d", &x[i]);memset(dp, 0, sizeof(dp));dp[0][b] = 1;int flag;for (int i = 1; i <= n; i++) {flag = 0;for (int j = 0; j <= Max; j++) {if (dp[i-1][j]) {if (j + x[i] <= Max) {dp[i][j + x[i]] = 1;flag = 1;}if (j - x[i] >= 0) {dp[i][j - x[i]] = 1;flag = 1;}}}if (flag == 0) break;}int ans = -1;for (int i = Max; i >= 0; i--)if (dp[n][i]) {ans = i;break;}printf("%d\n", ans);}return 0; }

?

?

轉載于:https://www.cnblogs.com/whileskies/p/7287398.html

總結

以上是生活随笔為你收集整理的[haut] 1281: 邪能炸弹 dp的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。