口袋妖怪(monster)
『题意描述』
最近鹅厂出了某款收藏游戏。顾名思义,该游戏就是要收藏小精灵。如果没玩过口袋妖怪的可以参考如下规则:
(1)玩家可以捕捉(收藏)视野范围内的所有精灵。
(2)每个精灵有一定的能力值c。
(3)每个精灵需要一定的活动空间v,即四次元口袋中剩余的活动空间需要大于v。
(4)为了可持续捕捉(收藏),每天最多只能抓k个精灵。
壮壮爱上了这款游戏,为了讨好壮壮哥,你需要为她写一款外挂,该外挂需要使得捕捉的精灵能力值之和尽可能大。
『输入』
第一行3个整数n、V、k,分别为可捕捉的精灵个数,四次元口袋总活动空间,最多捕捉的精灵个数。
接下来n行,每行2个整数ci、vi分别为精灵的能力值和需要的活动空间。
『输出』
一行,一个整数,为最大能力值之和。
【输入样例 1】
3 4 2
1 3
2 1
3 4
【输出样例 1】
3
提示
对于100%数据
1<= n,k <=100 , 1<= V<= 1000
1<=ci <= 10000,1<=vi<=1000
『解题思路』
二维费用背包,一维空间,一维个数
『代码』
#include <bits/stdc++.h>
using namespace std;
const int Max = 1005;
int a[Max],b[Max],c[Max],dp[Max][11];
int main() {
int n,m,k;
cin>>n>>m>>k;
for(int i =1; i <= n; i++) {
cin>>a[i]>>b[i]>>c[i];
}
for(int i =1; i <= n; i++) {
for(int j = m; j >= 0; j--) {
for(int q = k; q >=0 ; q--) {
if(q - b[i] >= 0 && j - a[i] >= 0)
dp[j][q] = max(dp[j][q],dp[j-a[i]][q-b[i]] + c[i]);
}
}
}
cout<<dp[m][k];
return 0;
}