题目大意:
有一个背包,里面的东西需要满足两个条件,不只是体积
求最多能装多少东西,这些东西的东西最小价值
思路:
双重背包
开两个数组,记录装的东西数量和价值
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<algorithm>
5 #include<cstring>
6 #include<cstdlib>
7 #include<queue>
8 #include<vector>
9 #include<set>
10 #include<map>
11 #include<stack>
12 #define inf 2147483611
13 #define ll long long
14 #define MAXN 110
15 using namespace std;
16 inline int read()
17 {
18 int x=0,f=1;
19 char ch=getchar();
20 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
21 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
22 return x*f;
23 }
24 int n,na[MAXN],nb[MAXN],v[MAXN],a,b;
25 int dpn[MAXN][MAXN],dpt[MAXN][MAXN];
26 int main()
27 {
28 n=read();
29 for(int i=1;i<=n;i++) na[i]=read(),nb[i]=read(),v[i]=read();
30 a=read(),b=read();
31 for(int k=1;k<=n;k++)
32 for(int i=a;i>=na[k];i--)
33 for(int j=b;j>=nb[k];j--)
34 {
35 if(dpn[i][j]==dpn[i-na[k]][j-nb[k]]+1)
36 dpt[i][j]=min(dpt[i-na[k]][j-nb[k]]+v[k],dpt[i][j]);
37 if(dpn[i][j]<dpn[i-na[k]][j-nb[k]]+1)
38 {
39 dpn[i][j]=dpn[i-na[k]][j-nb[k]]+1;
40 dpt[i][j]=dpt[i-na[k]][j-nb[k]]+v[k];
41 }
42 }
43 printf("%d",dpt[a][b]);
44 }