ssl2290-潜水员【dp之二维费用】
其實這是一道例題,但確實是我做過最難(其他的水到炸)的一道二維費用
Description
潛水員為了潛水要使用特殊的裝備。他有一個帶2種氣體的氣缸:一個為氧氣,一個為氮氣。讓潛水員下潛的深度需要各種的數量的氧和氮。潛水員有一定數量的氣缸。每個氣缸都有重量和氣體容量。潛水員為了完成他的工作需要特定數量的氧和氮。他完成工作所需氣缸的總重的最低限度的是多少?
例如:潛水員有5個氣缸。每行三個數字為:氧,氮的(升)量和氣缸的重量:
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
如果潛水員需要5升的氧和60升的氮則總重最小為249 (1,2或者4,5號氣缸)。
你的任務就是計算潛水員為了完成他的工作需要的氣缸的重量的最低值。
Input
從文本文件gas.in中讀入數據。
第一行有2整數t,a(1<=t<=21,1<=a<=79)。它們表示氧,氮各自需要的量。
第二行為整數n (1<=n<=1000)表示氣缸的個數。
此后的n行,每行包括ti,ai,wi(1<=ti<=21,1<=ai<=79,1<=wi<=800)3整數。這些各自是:第i個氣缸里的氧和氮的容量及汽缸重量。
Output
僅一行包含一個整數,為潛水員完成工作所需的氣缸的重量總和的最低值。
Sample Input
5 60
5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
Sample Output
249
解題思路
? 因為這里是求最小值,所以這里我就反推吧。emmmmmmmmmmmmmm?
代碼
#include<cstdio> #include<iostream> using namespace std; int v,u,n,vh[1001],uh[1001],w[1001]; int f[101][101]; int main() {memset(f,127,sizeof(f));f[0][0]=0;scanf("%d%d%d",&v,&u,&n);for (int i=1;i<=n;i++) scanf("%d%d%d",&vh[i],&uh[i],&w[i]);//輸入for (int i=1;i<=n;i++)for (int j=v;j>=0;j--)for (int k=u;k>=0;k--)//循環兩個費用{int t1=j+vh[i],t2=k+uh[i];//反推if (t1>v) t1=v;//避免過大if (t2>u) t2=u;//避免過大f[t1][t2]=min(f[t1][t2],f[j][k]+w[i]);//求最小值}printf("%d",f[v][u]); }總結
以上是生活随笔為你收集整理的ssl2290-潜水员【dp之二维费用】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拓怎么读 拓的读音
- 下一篇: 背包例题【dp练习】