5 3 20 20
5 10 1 200
10 5 1 100
8 11 2 56
10 10 2 50
5 5 3 100
300
显然这是个背包,我们乍一看,有两个值是限制我们的所以01包
然后每个箱子还只能用一瓶,其实我们只需要把循环的顺序换一下就好了
先每个箱子->生命值->精神值->每瓶药剂 如果一个箱子可以取多瓶的话就放在箱子后面就可以啦
记得必须要大于药剂的伤害和精神
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 struct sb 5 { 6 int w,v,t,p; 7 }a[1001]; 8 vector <int> k[1001]; 9 int f[1001][1001]; 10 int main () 11 { 12 int n,m,x,y; 13 cin>>n>>m>>x>>y; 14 for (int i=1;i<=n;i++) 15 { 16 cin>>a[i].w>>a[i].v>>a[i].t>>a[i].p; 17 k[a[i].t].push_back(i); 18 } 19 for (int i=1;i<=m;i++) 20 { 21 for (int c=x;c>=0;c--) 22 { 23 for (int d=y;d>=0;d--) 24 { 25 for (int j=0;j<k[i].size();j++) 26 { 27 int t=k[i][j]; 28 if (c>=a[t].w&&d>=a[t].v) 29 f[c][d]=max(f[c][d],f[c-a[t].w][d-a[t].v]+a[t].p); 30 } 31 32 } 33 } 34 } 35 cout<<f[x][y]; 36 }
原文:https://www.cnblogs.com/zjzjzj/p/10778872.html