P1794 装备运输_NOI导刊2010提高(04)
题目描述
德国放松对英国的进攻后,把矛头指向了东边——苏联。1943年初,东线的战斗进行到白热化阶段。据可靠情报,90余万德国军队在库尔斯克准备发动浩大攻势。因此,朱可夫元帅要求你立即从远东的军工厂运输大量装备支援库尔斯克前线。列车司机告诉你,一趟列车最多可以容纳V体积的武器装备,但是你可能不能装满,因为列车承受不了那么大的重量,一趟列车最多可以承载C单位的重量。同时,军工厂仓库提供给你一份装备清单,详细记录了每件装备的体积、重量和火力。为了有效支援朱可夫元帅,你要找到一种方案,使得总火力值最大。
输入输出格式
输入格式:
第一行:V和G表示最大体积和重量。
第二行:N表示仓库有N件装备。
第三到N + 2行:每行3个数Ti Vi Gi表示各装备的火力值、体积和重量。
输出格式:
输出一个数,表示可能获得的最大火力值。
输入输出样例
输入样例#1:
6 5 4 10 2 2 20 3 2 40 4 3 30 3 3
输出样例#1:
50
说明
对于100%的数据,V,G,N≤500
01背包,f[j][k] 表示体积为j,质量为k,设计的最大火力,f[j][k] = max(f[j-v[i]][k-g[i]]+t[i],f[j][k]);
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int f[510][510]; 5 int v[510],g[510],t[510]; 6 int n,V,G; 7 8 int main() 9 { 10 scanf("%d%d%d",&V,&G,&n); 11 for (int i=1; i<=n; ++i) 12 scanf("%d%d%d",&t[i],&v[i],&g[i]); 13 for (int i=1; i<=n; ++i) 14 for (int j=V; j>=v[i]; --j) 15 for (int k=G; k>=g[i]; --k) 16 f[j][k] = max(f[j-v[i]][k-g[i]]+t[i],f[j][k]); 17 printf("%d",f[V][G]); 18 return 0; 19 }