(一次a……)
好的上算法标签:
嗯这是个二维背包
(万年不变分隔线)
二维的题就是在一维基础上增加了一个条件,这个背包不仅含有质量还有体积。所以我们增加一层循环。核心算法:
for(int i=1;i<=n;i++) for(int j=m;j>=zl[i];j--) for(int k=v;k>=tj[i];k--) f[i][j][k]=max([f[i-1][j][k],f[i-1][j-z1[i]][k-v1[i]]+c[i]);
降二维节省空间:
for(int i=1;i<=n;i++) for(int j=m;j>=zl[i];j--) for(int k=v;k>=tj[i];k--) f[j][k]=max([f[j][k],f[j-z1[i]][k-v1[i]]+c[i]);
好的扯回原题:nasa的食物计划
ac代码如下:(懒得写解释)
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<cmath> using namespace std; int v,m; int n; int tj[1000],zl[1000],dgc[1000]; int f[5001][5001]; int main() { cin>>v>>m>>n; for(int i=1;i<=n;i++) cin>>tj[i]>>zl[i]>>dgc[i]; for(int i=1;i<=n;i++) for(int j=m;j>=zl[i];j--) for(int k=v;k>=tj[i];k--) f[j][k]=max(f[j][k],f[j-zl[i]][k-tj[i]]+dgc[i]); cout<<f[m][v]; }
end-