題目描述
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輸出 樣例資料218 3600 3 1800
22 4000 12 3000
28 6000 0 3000
32 8000 24 6000
輸入
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,顧名思義,就是解決一些區間內的最優值的問題,一般和列舉結合運用,定義結構體什麼的...