NASA的食物計劃
阿新 • • 發佈:2020-12-04
多一個維度的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;View Codeint 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; }