第二次做自己學校oj的題目,貢獻了三個tle,兩個re。。
其實這是一道非常非常經典的dp題。題目的意思,在標程裡面寫的很清楚了:從數列中選取若干個數,使其和與m的差的絕對值最小。
我開始想到的是那個分硬幣的題。那種近乎暴力的方法,在這道題目上用,tle了,因為這個資料的大小就是超了原來的想法,剛開始題目沒看清楚,以為能過的。
現在簡述一下解決這個問題:從數列中選取若干個數,使其和與m的差的絕對值最小 的思路。
我們用乙個陣列d[i][j]來表示/取到第i個數字時,在a[1],a[2]......,a[i]個中/任取若干個數/的和,使得/這個和/與j的差值/的絕對值/最小的時候/的這個差值。
當i=0時,d[0][j]=-j,因為乙個都沒取的時候,跟j的差值顯然是j。這個就是邊界條件了。
再看一般情況。這個時候的狀態轉移方程是dp(i,j)=min
為了讓自己更明白,自己給自己重新解釋一遍:
當遇到第i個數字時,a[i]可以不取。這個時候dp(i,j)=dp(i-1,j)
如果取了,就要看j的大小了,所以dp(i,j)= dp(i-1,j-a[j])【a[j]j】
剩下的就是一些細節問題了,下面是**:
view code
1 #include 2 #include 3 #include 4using
namespace
std;
5int d[1001][1001];//
dp陣列
6int a[1001];//
記錄每個氨基酸的分子量
7int dp(int c,intw)8
17else
1832
else
33 ans = abs(r) < abs(t) ?r : t;34}
35return
ans;36}
37int
main()
3848
for(i = 0;i <= c;i++)
49for(j = 0;j <= w - 18;j++)
50 d[i][j] = 2000
;51 cout<
53 }
1 24學習計畫
1 在我們第乙個課題的基礎上。改寫定時器中斷的內容,做到每隔1s閃爍,再每隔2s閃爍,再隔3s閃爍,然後一直這樣迴圈,其他的led還有示波器都和原來的要求一樣。一遍一遍的對照著led0開始計算led1是不是已經達到了迴圈的要求。1 每隔一秒閃爍 則週期為2 每隔2s閃爍則週期為4 每隔3s閃爍,週期...
CSU OJ 集訓難度(線段樹)
小l正在組織acm暑假集訓,但眾所周知,暑假集訓的萌新中有oi神犇,也有暑假才開始學演算法的萌新,如果統一集訓的難度,無法很好地讓萌新們得到訓練,所以小l想了乙個辦法,根據每次測試的情況,改變萌新們的集訓難度。現在將萌新們編號為1到n,最初萌新們的集訓難度為v0,測試後有兩種操作,第一種是某一區間的...
12 4 友元函式
類中的私有成員和保護成員是只能類內訪問,但在某些特殊情況,我們希望類外也能訪問,這就要用到友元技術。在類中宣告該函式並在前面加上friend關鍵字,這樣函式就可以暢通無阻地訪問私有和保護成員了。12.4.1 全域性函式做友元 include include using namespace std c...