1. 程式人生 > >潛水員(Codevs 5056)

潛水員(Codevs 5056)

潛水員

描述
潛水員為了潛水要使用特殊裝備。他有一個帶兩種氣體的氣缸:一個為氮氣,一個為氧氣。讓潛水員下潛的深度需要各種數量的氧和氮。潛水員有一定數量的氣缸。每個氣缸都有重量和氣體容量。潛水員為了完成他的工作需要特定的氧和氮。他完成工作所需氣缸的總重最低限度是多少?
例如:潛水員有5個氣缸。每行有三個數字為:氧、氮的量(升)和氣缸的重量:
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
如果潛水員需要5升的氧和60升的氮則總重的最小值為249(1,2或4,5號氣缸)。
你的任務就是計算潛水員為了完成他的工作需要的氣缸的重量的最低值。

輸入
第一行有2個整數m,n(1<=m<=21,1<=n<=79)。它們表示氧、氮各自需要的量。
第二行為整數k(1<=k<=1000)表示氣缸的個數。
此後的k行,每行包括ai,bi,ci(1<=ai<=21,1<=bi<=79,1<=ci<=800)3整數
這些各自是:第i個氣缸裡的氧和氮的容量及氣缸重量。

輸出
僅一行,包含一個整數,為潛水員完成工作所需氣缸的重量總和的最低值。

樣例輸入
5 60
5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
樣例輸出
249
提示
提示 1<=m<=21,1<=n<=79 1<=k<=1000 1<=ai<=21,1<=bi<=79,1<=ci<=800


Analysis

和我想的差不多,發現這個東西N2和O2其實是沒有上限的,也就是說如果我們用揹包的思想來想,這個包是可以無限大的,那麼我們常見套路從i-1推i,顯然不可做
那就轉變一下,每次都從i去推i+1,只要當前已有的N2和O2數量加上現在這個氣缸的貢獻是大於我們需要的m和n,我們就直接把這次的貢獻算在f[m][n]上
然後就完啦

Code

#include<bits/stdc++.h>
#define N 2000
using namespace std;
int n,m,k;
int o2[N],n2[N],f[N][N],c[N];
int main(){
	scanf("%d%d%d",&m,&n,&k);
	int i,j,p;
	for(i=1;i<=k;++i) scanf("%d%d%d",&o2[i],&n2[i],&c[i]);
	memset(f,127/3,sizeof(f));
	f[0][0]=0;
	for(i=1;i<=k;++i)
{ for(j=m;j>=0;--j)//從前面的狀態往後轉移 for(p=n;p>=0;--p) { int jj=j+o2[i]; int pp=p+n2[i]; if(jj>m) jj=m; if(pp>n) pp=n; f[jj][pp]=min(f[j][p]+c[i],f[jj][pp]); } } printf("%d",f[m][n]); return 0; }

相關推薦

二維揹包 - 潛水員Codevs 5056

潛水員 描述 潛水員為了潛水要使用特殊裝備。他有一個帶兩種氣體的氣缸:一個為氮氣,一個為氧氣。讓潛水員下潛的深度需要各種數量的氧和氮。潛水員有一定數量的氣缸。每個氣缸都有重量和氣體容量。潛水員為了完成他的工作需要特定的氧和氮。他完成工作所需氣缸的總重最低限度是多少? 例如:潛水員有5

潛水員Codevs 5056

潛水員 描述 潛水員為了潛水要使用特殊裝備。他有一個帶兩種氣體的氣缸:一個為氮氣,一個為氧氣。讓潛水員下潛的深度需要各種數量的氧和氮。潛水員有一定數量的氣缸。每個氣缸都有重量和氣體容量。潛水員為了完成他

擺花codevs 1315

dp問題 div can %d 輸出 估計 一個 class 收獲 題目描述 Description 小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共m盆。通過調查顧客的喜好,小明列出了顧客最喜歡的n種花,從1到n標號。為了在門口展出更多種花,規定第i

一元三次方程 codevs 1038題解

【問題描述】      有形如:ax3+bx2+cx+d=0這樣的一個一元三次方程。給出該方程中各項的係數(a,b,c,d均為實數),並約定該方程存在三個不同實根(根的範圍在-100至100之間),且根

石子歸併問題codevs 1048

題目描述 Description 有n堆石子排成一列,每堆石子有一個重量w[i], 每次合併可以合併相鄰的兩堆石子,一次合併的代價為兩堆石子的重量和w[i]+w[i+1]。問安排怎樣的合併順序,能夠使得總合並代價達到最小。 輸入描述 Input Descri

雙棧排序codevs 1170題解

【問題描述】 Tom最近在研究一個有趣的排序問題。如圖所示,通過2個棧S1和S2,Tom希望藉助以下4種操作實現將輸入序列升序排序。 操作a 如果輸入序列不為空,將第一個元素壓入棧S1 操作b 如果棧S

多叉樹轉二叉樹+樹形dpcodevs 1746 貪吃的九頭龍 2002noi

main bsp 搜索 我們 bre define div 思考 import 題目傳送門 看到這個題目我們要先把問題簡化了,條件中是多叉樹,我們可以把它轉換成二叉樹,左邊是兒子右邊是兄弟的儲存方式。 首先先判斷否的部分,當總的果子小於需求,也就是N-k<M-1時

codevs 3981 動態最大子段和線段樹

輸入 typedef fault namespace 一行 scrip img sum spl 題目傳送門:codevs 3981 動態最大子段和 題目描述 Description 題目還是簡單一點好... 有n個數,a[1]到a[n]。 接下來q次查詢,每次動

codevs 1022 覆蓋匈牙利演算法

codevs 1022 覆蓋(匈牙利演算法)   Time Limit: 1 Sec   Memory Limit: 128 MB Description    有一個N×M的單位方格中,其中有些方格是水塘,其他方格是陸地。如果要用1×2的矩陣區覆蓋(覆蓋過程不容許有任何部分重疊)這個陸

5056】Boring count 尺取法

題幹: You are given a string S consisting of lowercase letters, and your task is counting the number of substring that the number of each l

codevs 1082 線段樹練習3 線段樹

ace des 兩種 ++ math 如果 input 題目 ret 題目: 題目描述 Description 給你N個數,有兩種操作: 1:給區間[a,b]的所有數增加X 2:詢問區間[a,b]的數的和。 輸入描述 Input Descrip

趣文我是一個線程

名稱 數據庫 的人 情況 http 大小 應付 中大 分享 http://blog.csdn.net/liaodehong/article/details/51206607 作者:IBM 劉欣   我是一個線程,我一出生就被編了個號: 0×3704,然後被領到一個昏暗的屋子

LA 3211 飛機調度2—SAT

選擇 排列 tps pri abs true nbsp queue 需要 https://vjudge.net/problem/UVALive-3211 題意: 有n架飛機需要著陸,每架飛機都可以選擇“早著陸”和“晚著陸”

acd - 1427 - Nice Sequence線段樹

eof [0 條件 class 最小值 cstring info div pre 題意:一個由n個數組成的序列(序列元素的範圍是[0, n])。求最長前綴 j 。使得在這個前綴 j 中對於隨意的數 i1 < i2。都滿足隨意的 m <= j。i1 在前 m

[UOJ #222][NOI2016]區間線段樹

ont 線段樹 div 最短 ans oid tro lib read Description 在數軸上有 n個閉區間 [l1,r1],[l2,r2],...,[ln,rn]。現在要從中選出 m 個區間,使得這 m個區間共同包含至少一個位置。換句話說,就是使得存在一個 x

kafka----kafka APIjava版本

spring mvc+my batis dubbo+zookeerper kafka restful redis分布式緩存 Apache Kafka包含新的Java客戶端,這些新的的客戶端將取代現存的Scala客戶端,但是為了兼容性,它們仍將存在一段時間。可以通過一些單獨的jar包調用這些客

日程管理bug report

studio get pen 效果 角度 自定義 用戶登錄 回來 而是 1.退出程序停留在歡迎界面 bug Description: 測試環境:win10、工具android studio; 測試步驟: 描述:當點開程序時,不是直接到登錄界面,會有一個可自定義化的歡迎界

webpack 入門0官翻

app 沒有 解決 ebp 回車 dir pts config 問題 0 建議最好全局先安裝一下webpack npm install webpack -g 1 新建一個文件夾,打開該文件夾,初始化package.json文件,安裝好webpack依賴 (都是基礎的li

OpenCV2學習筆記十五:利用Cmake高速查找OpenCV函數源代碼

one 生成 img log 分享 lan 學習筆記 全部 modules 在使用OpenCV時,在對一個函數的調用不是非常了解的情況下,通常希望查到該函數的官方聲明。而假設想進一步研究OpenCV的函數,則必須深入到源碼。在VS中我們能夠選中想要查

日程管理appbug report

報錯 進行 android 設置 用戶登錄 登錄驗證 理想 運行 rip 一、用戶登錄驗證密碼過短   Description:   測試環境:Android Studio自帶的ADT模擬器(安卓6.0)   準備工作:將工程導入AS,並啟動模擬器進行測試   測試步驟:1