xinjun與陰陽師

2022-05-05 14:18:08 字數 2017 閱讀 8705

xinjun是各類手遊的狂熱粉絲,因隨手一氪、一氪上千而威震工大,現在他迷上了陰陽師。xinjun玩手游有乙個習慣,就是經過層層計算制定出一套方案來使操作利益最大化(因此即使有掃蕩券也不用,故稱聖雄肝帝)。已知陰陽師有n個模式可以操作,模式i有ai種操作,但每種模式每日只能選用一種操作,可以不選。操作j能收益vj,但需要花費體力wj點。xinjun每日擁有體力m點,求他每日最多能得到多少收益。

輸入描述:

第一行乙個正整數t(t<=10),表示共有t組資料。

對於每組資料,第一行兩個正整數n,m(1<=n,m<=1000)。

接下來n段資料,每段第一行乙個正整數ai(1<=ai<=1000),第二行ai個正整數vj(1<=vj<=1000),第三行ai個正整數wj(1<=wj<=1000)。

每組資料ai之和不大於104。

輸出描述:

對每組資料輸出一行,即xinjun每日最多能得到多少收益。

示例1

輸入

1310

2233

2211

3415

5

輸出

9
01揹包,但是獨特點在於,n個模式,每個模式有ai種操作,乙個模式只能用一次操作,也就是並非所有操作都參與最終受益,相同模式下只能選乙個操作。

這怎麼解決呢?

我們用二維數字來存受益與花費

v[i][j]表示第i個模式下第j種操作的受益

w[i][j]表示第i個模式下第j種操作的花費

那麼遞推方程就是

f[j] = max(f[j],f[j-w[i][k]]+v[i][k]);

三重for迴圈的含義

在當前容量下,列舉每一種操作,保留最佳情況

我原本以為複雜度會超,發現我想太多了,資料有點水。。

這種方法應該是算是比較簡單明瞭

#include

using

namespace std;

const

int maxn =

1005

;int n,m;

int f[maxn]

;int c[maxn]

;int w[maxn]

[maxn]

;int v[maxn]

[maxn]

;int t;

intmain()

for(

int j =

1; j <= c[i]

;++j)

}memset

(f,0

,sizeof

(f))

; f[0]

=0;for

(int i =

1; i <= n;

++i)

//模式 }}

cout << f[m]

<< endl;

}return0;

}

還有個方式:

參考模式與模式之間都是獨立的

每乙個模式不是只能選一種嗎?那我就挑選出最佳的操作,然後進入下乙個模式,一直這樣走

#include

#include

using

namespace std;

const

int n =

1010

;struct nodedp[n]

;int main (

)for

(int i=

0;i)for

(int i=

0;ifor(

int i=

0;i<=w;i++)}

cout<.f

(dp,0,

sizeof dp);}

return0;

}

xinjun與陰陽師

時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld xinjun是各類手遊的狂熱粉絲,因隨手一氪 一氪上千而威震工大,現在他迷上了陰陽師。xinjun玩手游有乙個習慣,就是經過層層計算制定出一套方案來使操作利益最大化...

nowcoder xinjun與陰陽師

看似是完全揹包的題目 可以看成是稍微加了種類限制的01揹包 所以三重迴圈解決 第一重是種類 第二重是容量 第三重是每一種中選擇乙個模式不斷更新dp一維陣列 include using namespace std const int n 1000 5 int n,m,dp n vector a n b...

試著在unity實現陰陽師抽卡效果

試著在unity實現陰陽師抽卡效果 之前為了社團活動 demoday,乙個展示社團成員遊戲作品的社團展會 做了乙個 程式。因為是硬核遊戲開發社團舉辦的遊戲展,我為此特地做了乙個陰陽師的抽卡系統如下 由於轉成gif格式不是很清楚,之前也忘了在b站上傳,基本表現效果就是這樣了。螢幕畫線仔細看還是能看到的...