學生在我們usaco的競賽中的得分越多我們越高興。我們試著設計我們的競賽以便人們能盡可能的多得分。現在要進行一次競賽,總時間t固定,有若干型別可選擇的題目,每種型別題目可選入的數量不限,每種型別題目有乙個si(解答此題所得的分數)和ti(解答此題所需的時間),現要選擇若干題目,使解這些題的總時間在t以內的前提下,所得的總分最大。
輸入包括競賽的時間,m(1 <= m <= 10000)和題目型別數目n(1 <= n <= 10000)。
後面的每一行將包括兩個整數來描述一種"題型":
第乙個整數說明解決這種題目能得的分數(1 <= points <= 10000),第二整數說明解決這種題目所需的時間(1 <= minutes <= 10000)。
第 1 行: 兩個整數:競賽的時間m和題目型別數目n。 第 2-n+1 行: 兩個整數:每種型別題目的分數和耗時。
單獨的一行,在給定固定時間裡得到的最大的分數。
300 4
100 60
250 120
120 100
35 20
【注釋】從第2種型別中選兩題和第4種型別中選三題
這是一題完全揹包問題,因為每道題可以做無限遍。
外層迴圈列舉n種題,內層列舉競賽的時間,但列舉時間時不能像01揹包一樣從v到1,
而是從1到v。因為每次計算最大分數時都需用到前面的狀態。
i為列舉的題,j為列舉的時間,f[i][j]表示當時間為j時,前i道題能達到的最大分數。
b為題目時間,a為分值,狀態轉移方程:(j>b[i]) , f[i][j]=max(f[i-1][j],f[i][j-b[i]]+a[i]), 1<=i<=n, 1<=j<=v
意思是如果做題目i的分值大於不做,f[i][j]等於做題的分值,否則等於不做題即上一道題的最大分值
#include
#include
#include
#include
using
namespace std;
int n,a[
10001
],s,ans,f[
10001][
10001
],v,b[
10001];
voiddp(
)else
ans=
max(ans,f[i]
[j])
;//記錄答案為最大分值}}
}voidin(
)}intmain()
2 29 學習心得
幾天的練習我一般在中午或晚上進行,總體來說效率不太高。因為我不太容易很專注的去做一件事。但我現在已經在積極的改正了。首先,我對數的範圍經常搞錯,經常爆範圍,有乙個題輸出數太大。只能乙個乙個輸出,以前沒想過,還是我做題太少了啊。做這些題其實思路發散一些很重要,有些題可以找到規律,防止超時。有些題有簡單...
229 兩數之和IV
題目描述 給定乙個二叉搜尋樹和乙個目標結果,如果 bst 中存在兩個元素且它們的和等於給定的目標結果,則返回 true。案例 1 輸入 5 3 6 2 4 7 target 9 輸出 true 案例 2 輸入 5 3 6 2 4 7 target 28 輸出 false definition for...
2 2 9 士兵站隊問題
9 士兵站隊問題 問題描述 在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點由整數座標 x,y 表示。士兵們可以沿網格邊上 下 左 右移動一步,但在同一時刻任一網格點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成 x,y x 1,y x n 1,y 如何選擇x...