練習 揹包DP 競賽得分

2021-08-09 03:26:00 字數 1729 閱讀 1070

題目描述

zzh 在經歷了無數次學科競賽的失敗以後,得到了乙個真理:做一題就要對一題!但是要完全正確地做對一題是要花很多時間(包括除錯時間),而競賽的時間有限。所以開始做題之前最好先認真審題,估計一下每一題如果要完全正確地做出來所需要的時間,然後選擇一些有把握的題目先做。 當然,如果做完了預先選擇的題目之後還有時間,但是這些時間又不足以完全解決一道題目,應該把其他的題目用貪心之類的演算法隨便做做,爭取「騙」一點分數。根據每一題解題時間的估計值,確定一種做題方案(即哪些題目認真做,哪些題目「騙」分,哪些不做),使能在限定的時間內獲得最高的得分。

輸入格式

第一行有兩個正整數 n 和 t,表示題目的總數以及競賽的時限(單位秒)。以下的 n 行,每行 4 個正整數 w1i 、t1i 、w2i 、t2i ,分別表示第 i 題:完全正確做出來的得分、完全正確做出來所花費的時間(單位秒)、「騙」來的分數、「騙」分所花費的時間(單位秒)。

其中,3≤n≤30,2≤t≤1080000,1≤w1i ,w2i≤30000; 1≤t1i,t2i≤t。

輸出格式

輸出所能得到的最高分值。

樣例資料1

輸入

4 10800

18 3600 3 1800

22 4000 12 3000

28 6000 0 3000

32 8000 24 6000

輸出

樣例資料2

輸入

3 7200

50 5400 10 900

50 7200 10 900

50 5400 10 900

輸出

分析:第二次做了,還是有點懵逼。列舉每一道題,再列舉每乙個時間點做或者騙能得到的最優值,用來更新整體的最優值。

**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int getint()

for(;isdigit(ch);ch=getchar())

sum=(sum<<3)+(sum<<1)+ch-48;

return sum*f;

}const

int n=35;

const

int w=1080005;

int w1[n],v1[n],w2[n],v2[n],n,t;

int dp[w],dp1[w],dp2[w];

int main()

int ans=0;

for(int j=1;j<=t;++j)

ans=max(ans,dp[j]);

cout

<'\n';

return

0;}

本題結。

校內模擬 最優得分(揹包DP)

第一檔資料暴力,第二檔資料因為沒有扣分限制所以就是乙個裸的01揹包。對於第三檔資料,因為有乙個b的限制,所以它選擇的做題順序會對得分產生影響。但因為b都是相同的,所以如果選好了要做哪些題目,顯然按照時間從小到大來做是最優的,排個序以後揹包就可以了。這些部分分基本上已經指明了正解的思路。仍然考慮選好要...

SSL 2292 競賽得分(dp)

學生在我們usaco的競賽中的得分越多我們越高興。我們試著設計我們的競賽以便人們能盡可能的多得分。現在要進行一次競賽,總時間t固定,有若干型別可選擇的題目,每種型別題目可選入的數量不限,每種型別題目有乙個si 解答此題所得的分數 和ti 解答此題所需的時間 現要選擇若干題目,使解這些題的總時間在t以...

揹包練習及區間dp

這幾天學了區間dp,怎麼說呢,揹包還沒掌握好久又接受了新的知識,更懵逼了。有點跟不上老師上課的講課速度了,課下必須多看多做,不然真的不會做題了。哎,現在甚至有時候連題目都讀不懂什麼意思了,更別說思路了。崩潰了!區間dp,顧名思義,就是解決一些區間內的最優值的問題,一般和列舉結合運用,定義結構體什麼的...