luogu P1507 NASA的食物计划
题目背景
NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安
全技术问题一直大伤脑筋,因此在各方压力下终止了航天
飞机的历史,但是此类事情会不会在以后发生,谁也无法
保证,在遇到这类航天问题时,解决方法也许只能让航天
员出仓维修,但是多次的维修会消耗航天员大量的能量,
因此NASA便想设计一种食品方案,让体积和承重有限的
条件下多装载一些高卡路里的食物.
思想:多出一个限制条件就增加一维数组
#include<iostream> #include<cstdio> using namespace std; int f[51][401][401],w[401],u[401],k[401];//W是体积,u是质量,k是卡路里 int main() { int v,m,n; scanf("%d%d%d",&v,&m,&n);//v是体积,m是质量 for(int i=1;i<=n;++i) { scanf("%d%d%d",w+i,u+i,k+i); } for(int i=1;i<=n;++i) { for(int j=1;j<=v;++j) { for(int q=1;q<=m;++q) { if(q>=u[i]) { if(j>=w[i]) { f[i][j][q]=max(f[i-1][j][q],f[i-1][j-w[i]][q-u[i]]+k[i]); } else { f[i][j][q]=f[i-1][j][q]; } } else { f[i][j][q]=f[i-1][j][q]; } } } } cout<<f[n][v][m]; }
另一种解法 压维打击
代码如下
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int f[401][401],w[401],u[401],k[401]; int main() { int v,m,n; scanf("%d%d%d",&v,&m,&n);//v是体积,m是质量 for(int i=1;i<=n;++i) { scanf("%d%d%d",w+i,u+i,k+i); } for(int i=1;i<=n;++i) { for(int j=v;j>=w[i];--j) { for(int q=m;q>=u[i];--q) { f[j][q]=max(f[j][q],f[j-w[i]][q-u[i]]+k[i]); } } } cout<<f[v][m]; }