买装备
题目大意:
有n件物品,每件物品有它的物抗,魔抗,价格,现在要在物抗魔抗各不小于一个值的前提下,使价格最小(每件物品只能买一件)
原题:
题目描述
mxy 沉迷于一个辣鸡游戏不可自拔。
为了加强角色的实力,mxy 决定重新买一套装备。已知现在有 n 件装备,每件装备会
ᨀ供一定的物理抗性和魔法抗性,并需要一定的价钱。mxy 想要保证至少有 a 的物抗和 b
的魔抗,请你计算出满足条件所需的最少金额。(装备不可重复购买)
输入
第一行两个整数 a,b 表示最少需要的物抗和魔抗。(1≤a≤21,1≤b≤79)
第二行为整数 n (1≤n≤21)表示装备的个数。
此后的 n 行,每行包括 ai,bi,mi(1≤ai≤21,1≤bi≤79,1≤mi≤800)3 整数,这
些各自是:第 i 件装备的物抗、魔抗和价钱
输出
一行一个整数,表示满足条件的最小金额
输入样例
5 60
5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
输出样例
249
说明
说明:选 1,2 或者 4,5 号装备
解题思路:
就是一个二维01背包,但要注意它的物抗魔抗不一定是刚刚好的,有可能是多一点的
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int am,bm,n,v,aa,bb,f[105][105];
int main()
{scanf("%d %d",&am,&bm);scanf("%d",&n);memset(f,0x7f,sizeof(f));for (int i=1;i<=n;++i){scanf("%d %d %d",&aa,&bb,&v);for (int j=am;j>aa;--j)for (int k=bm;k>bb;--k)f[j][k]=min(f[j][k],f[j-aa][k-bb]+v);//二维01背包for (int j=am;j>aa;--j)for (int k=bb;k>=0;--k)f[j][k]=min(f[j][k],f[j-aa][0]+v);//多出魔抗for (int j=aa;j>=0;--j)for (int k=bm;k>bb;--k)f[j][k]=min(f[j][k],f[0][k-bb]+v);//多出物抗for (int j=aa;j>=0;--j)for (int k=bb;k>=0;--k)f[j][k]=min(f[j][k],v);//都有多出的}printf("%d",f[am][bm]);
}