【洛谷p1507】NASA的食物计划

(一次a……)

NASA的食物计划【传送门】

好的上算法标签:

嗯这是个二维背包


(万年不变分隔线)

二维的题就是在一维基础上增加了一个条件,这个背包不仅含有质量还有体积。所以我们增加一层循环。核心算法:

    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-

原文地址:https://www.cnblogs.com/zhuier-xquan/p/10506517.html