1. 程式人生 > 實用技巧 >NASA的食物計劃

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