【背包】买装备
買裝備
題目大意:
有n件物品,每件物品有它的物抗,魔抗,價格,現(xiàn)在要在物抗魔抗各不小于一個值的前提下,使價格最小(每件物品只能買一件)
原題:
題目描述
mxy 沉迷于一個辣雞游戲不可自拔。
為了加強(qiáng)角色的實力,mxy 決定重新買一套裝備。已知現(xiàn)在有 n 件裝備,每件裝備會
?供一定的物理抗性和魔法抗性,并需要一定的價錢。mxy 想要保證至少有 a 的物抗和 b
的魔抗,請你計算出滿足條件所需的最少金額。(裝備不可重復(fù)購買)
輸入
第一行兩個整數(shù) a,b 表示最少需要的物抗和魔抗。(1≤a≤21,1≤b≤79)
第二行為整數(shù) n (1≤n≤21)表示裝備的個數(shù)。
此后的 n 行,每行包括 ai,bi,mi(1≤ai≤21,1≤bi≤79,1≤mi≤800)3 整數(shù),這
些各自是:第 i 件裝備的物抗、魔抗和價錢
輸出
一行一個整數(shù),表示滿足條件的最小金額
輸入樣例
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]); }總結(jié)
- 上一篇: revi插件使用方法REVIT插件
- 下一篇: 用电脑更舒适更好的使用电脑