第一檔資料暴力,第二檔資料因為沒有扣分限制所以就是乙個裸的01揹包。對於第三檔資料,因為有乙個b的限制,所以它選擇的做題順序會對得分產生影響。但因為b都是相同的,所以如果選好了要做哪些題目,顯然按照時間從小到大來做是最優的,排個序以後揹包就可以了。
這些部分分基本上已經指明了正解的思路。仍然考慮選好要做哪些題目以後按照什麼順序來做最優。假設存在兩個題目i和j,j原本在i之前做,但它們兩個的順序交換以後能讓解變得更優,那麼設在i之前過去的時間為t,會滿足條件ai
−bi∗
(t+c
i)+a
j−bj
∗(t+
ci+c
j)>aj
−bj∗
(t+c
j)+a
i−bi
∗(t+
ci+c
j)整理一下這個式子,可以得到bi
ci>bj
cj於是按照bc
從大到小排序以後再做揹包即可。注意要用實數除法。
#include
#include
#include
using
namespace
std;
int t,n,t,ans,f[3010];
bool vis[20],one,zero;
struct testv[1010];
int comp2(test u,test v)
int main()
sort(v+1,v+n+1,comp2);
memset(f,0,sizeof(f));
for (int i=1;i<=n;i++)
for (int j=t;j>=v[i].c;j--)
f[j]=max(f[j],f[j-v[i].c]+v[i].a-j*v[i].b);
for (int i=0;i<=t;i++) ans=max(ans,f[i]);
printf("%d\n",ans);
}return
0;}
普通的揹包問題包括大部分dp問題好像都和選擇物品的順序沒有什麼關係啊對吧但是這道題是個例外誒。在dp的基礎上又加了一些貪心的思路在裡面。 練習 揹包DP 競賽得分
題目描述 zzh 在經歷了無數次學科競賽的失敗以後,得到了乙個真理 做一題就要對一題!但是要完全正確地做對一題是要花很多時間 包括除錯時間 而競賽的時間有限。所以開始做題之前最好先認真審題,估計一下每一題如果要完全正確地做出來所需要的時間,然後選擇一些有把握的題目先做。當然,如果做完了預先選擇的題目...
校內模擬 帳篷(凸包DP)
簡要題意 有一些要被圍起來的點,有一些木樁,請你以這些木樁為頂點構造乙個凸多邊形,使得要求的點全部在其內部,同時在原點處有乙個最高點,請你最小化以你選擇的凸多邊形為底面的椎體的側面積。凸包dp sb題一道。考場上沒看到凸多邊形的限制去想凹的情況了。include define ll long lon...
揹包 DP 揹包
揹包 題目 是dp中較為常見的題目 分為 0 1 揹包 完全揹包 和多重揹包 這三類 是越來越深入的首先來介紹一下 0 1揹包 首先 0 1 揹包的含義是 給你乙個容量位m的揹包 然後給你n個物品 每個物品具有一定價值和一定重量 會站一定的揹包空間 答案是在n個物品中那幾個 然後使得到的價值最大 首...