多一个维度的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; }