NASA的食物计划

NASA的食物计划

多一个维度的01背包问题.

 

dp[i][j][k]表示在前i种食品中选择出总体积不大于j且总重量不大于k的食物所能得到的最大卡路里.

省略细节的描述,压维后用dp[j][k]存储.因为是01背包所以j,k都从最大值开始循环并递减.

 j和k并没有优先级问题,简单地两层循环即可.

可见维度的拓展(了一维)并没有给这种问题带来什么麻烦.

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int V, M, n;
int t[60], w[60], v[60], dp[410][410];

int main(){
    cin >> V >> M >> n;
    for(int i = 0; i < n; i++) cin >> t[i] >> w[i] >> v[i];

    for(int i = 0; i < n; i++)
        for(int j = V; j >= t[i]; j--)
            for(int k = M; k >= w[i]; k--)
                dp[j][k] = max(dp[j][k], dp[j - t[i]][k - w[i]] + v[i]);

    cout << dp[V][M] << endl;

    return 0;
}
View Code
posted @ 2020-12-04 15:08  goverclock  阅读(110)  评论(0编辑  收藏  举报