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站上傳,基本表現效果就是這樣了。螢幕畫線仔細看還是能看到的...