-->测评传送门
题目描述
潜水员为了潜水要使用特殊的装备。他有一个带2种气体的气缸:一个为氧气,一个为氮气。让潜水员下潜的深度需要各种的数量的氧和氮。潜水员有一定数量的气缸。每个气缸都有重量和气体容量。潜水员为了完成他的工作需要不少于特定数量的氧和氮。他完成工作所需气缸的总重的最低限度的是多少?
输入格式
第一行有2整数m,n(1<=m<=21,1<=n<=79)。它们表示氧,氮各自需要的量。 第二行为整数k(1<=k<=1000)表示气缸的个数。 此后的k行,每行包括ai,bi,ci(1<=ai<=21,1<=bi<=79,1<=ci<=800)3整数。这些各自是:第i个气缸里的氧和氮的容量及汽缸重量。
输出格式
仅一行包含一个整数,为潜水员完成工作所需的气缸的重量总和的最低值。
样例
样例输入
5 60
5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
样例输出
249
可以说是集合了基础背包的难度,还是难到我了
解析:
- 还是老思路,一个一个枚举,能放就放,不过我们先将 f[ ] 初始化为无穷大,一开始只把 f[0][0] 设为 0
- 要注意的是,放的容量若超过了题设要求,我们就把它压回题设最大边界,不影响最终结果哦~反正够了就行
一看代码就懂啦:
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int O[1001],N[1001],w[1001],f[1001][1001]; int main() { int nedo,nedn,n; scanf("%d%d%d",&nedo,&nedn,&n); for(int i=1;i<=n;++i) scanf("%d%d%d",&O[i],&N[i],&w[i]); memset(f,13,sizeof(f)); f[0][0]=0; for(int i=1;i<=n;++i) { for(int j=nedo;j>=0;j--) { for(int k=nedn;k>=0;k--) { int t1=j+O[i],t2=k+N[i]; if(t1>nedo) t1=nedo; if(t2>nedn) t2=nedn; if(f[t1][t2]>f[j][k]+w[i]) f[t1][t2]=f[j][k]+w[i]; } } } printf("%d",f[nedo][nedn]); return 0; }