分組揹包(課題選擇)

2022-06-08 14:00:13 字數 1895 閱讀 2826

g. 4# 課題選擇 [ problem 4840

] [ discussion ]

description

matrix67 要在下個月交給老師 n

'>n

篇**,**的內容可以從 m

'>m

個課題中選擇。由於課題數有限,matrix67 不得不重複選擇一些課題。完成不同課題的**所花的時間不同。具體地說,對於某個課題 i

'>i

i,若 matrix67 計畫一共寫 x

'>

x 篇**,則完成該課題的**總共需要花費 ai∗

xbi'>ai∗x^bi

個單位時間(係數 a

i'>ai

和指數 b

i'>bi

均為正整數)。給定與每乙個課題相對應的 a

i'>ai

ai 和 b

i'>bi

bi 的值,請幫助 matrix67 計算出如何選擇**的課題使得他可以花費最少的時間完成這 n

'>n

篇**。

input

第一行用空格隔開的正整數 n

'>n

和 m'>m

,分別代表需要完成的**數和可供選擇的課題數。以下 m

'>m

行每行有兩個用空格隔開的正整數。其中,第 i

'>i

行的兩個數分別代表與第 i

'>i

個課題相對應的時間係數 a

i'>ai

和指數 b

i'>bi

。output

輸出完成 n

'>n

篇**所需要耗費的最少時間。

samples

input copy

10 3

2 11 2

2 1

output

19

hint∗4

1+1∗

12+2

∗51=

8+1+

10=19'>2∗4^1+1∗1^2+2∗5^1=8+1+10=1

。可以證明,不存在更優的方案使耗時小於 19。

【資料規模】

source

石光中學 2023年 泉州複賽模擬 普及組 day1

dp[i][j]表示前i個課題,分配j篇**的最少時間

dp[i][j] = min(dp[i][j], dp[i-1][k]+c[i][j-k])

其中c[i][j-k]意為第i個課題,寫j-k篇**的時間

#pragma gcc optimize(2)#include

#define x first

#define y second

using

namespace

std;

typedef

long

long

ll;int

read()

while(ch>='

0'&&ch<='

9')

return x*f;

}const

int maxn=1e3+100;//

c[i][j]表示a[i]這個課題被選擇j次時對答案的貢獻.

ll c[maxn][maxn];

ll a[maxn],b[maxn],dp[maxn];

ll qpow(ll a,ll b)

a=a*a;

b/=2

; }

return

ans;

} int

n,m;

void

ini()

for(int i=1;i<=m;i++)

}}int

main()}}

cout

}

分組揹包 最佳課題選擇

題目描述 matrix67要在下個月交給老師n篇 的內容可以從m個課題中選擇。由於課題數有限,matrix67不得不重複選擇一些課題。完成不同課題的 所花的時間不同。具體地說,對於某個課題i,若matrix67計畫一共寫x篇 則完成該課題的 總共需要花費ai xbi個單位時間 係數ai和指數bi均為...

通天之分組揹包 分組揹包

本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 傳送門 分組揹包的模板 偽 1 for int i 1 i 組數 i 6 7 直接套模板即可。code 1 include2 pragma gcc optimize 3 3const int n 1e5 10 4 using namesp...

luogu P1336 最佳課題選擇 揹包dp

題目描述 matrix67要在下個月交給老師n篇 的內容可以從m個課題中選擇。由於課題數有限,matrix67不得不重複選擇一些課題。完成不同課題的 所花的時間不同。具體地說,對於某個課題i,若matrix67計畫一共寫x篇 則完成該課題的 總共需要花費ai x bi個單位時間 係數ai和指數bi均...