Dima and Salad dp 思維轉化

2021-10-05 06:16:27 字數 1084 閱讀 5914

題目要求選出來的物品滿足 sum( a[i] )=ksum( b[i] ),移動到同一邊 ,sum( a[i] )-ksum( b[i] )==0.令

c[i]=a[i]-k*b[i],題目轉化為從 n 個 體積為 c[i] , 價值為 w[i] 的物品中取出若干物品,使得 sum( w[i] )最大,並且 sum( c[i] )==0,

我們令 dp[i][j]表示列舉到第i個物品時候, 體積之和為j的最大價值,很容易 得到轉移方程 :

dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]),接下來是初始化,由於狀態定義的是恰好體積為j ,其實我們還要在轉移方程取值時候判斷該點狀態存不存在,但是我們如果初始化為-inf就不用,因為不可能讓不存在的值在最後被使用

還有乙個細節點,就是c[i]有可能是負數,這樣可能j會小於0,導致re,所以我們只要吧原點往上移動到1e5這個點即可 ,即dp[i][0] 變成 dp[i][1e5],那麼在初始化的時候,初始化dp[0][0]=0的時候改為

dp[0][1e5]=0即可 。

最後判斷一下dp[n][1e5]是否大於0即可

#include

#include

#include

using

namespace std;

const

int n=

2e5+5;

#define ll long long

int dp[

106]

[n];

intmain()

int m=n*

1000

;memset

(dp,

-0x3f3f3f

,sizeof

(dp));

dp[0]

[m]=0;

for(

int i=

1;i<=n;i++)}

if(dp[n]

[m]>

0)cout << dp[n]

[m];

else cout <<

"-1"

;return0;

}

思 說文解字

說文解字 裡說 思,容也,從心囟聲。我們過去都以為思的上半部分是個 田 其實不是。從篆文本形來看,上半部原來是囟門的 囟 我們知道,剛出生的嬰兒,顱骨上方有一塊尚未完全閉合的地方,那個地方就是囟門。說白了,就是頭腦加心靈共同工作的狀態,才叫有所思。大家或許會問 你說 從心囟聲 囟門這個 囟 跟我們今...

寫For時請三思再三思

昨天寫了這樣一段處理xml的 處理系統返回的結果,最後居然導致系統死慢死慢的,我百思不得其解,到底是document類處理的問題呢?還是資料過多?private void formatresults condition condition catch xpathexpressionexception...

《思修》監考感悟

今天下午大一的學生在機房進行了期末的思修考試,我也身擔乙個重要的職務 監考人員,第一次進行上機考試,考試系統是我們提高班的學生做的,期間很可能會出現一些意想不到的問題。下面說說考試期間遇到的問題。考試之前雖然一再的強調不要重新整理 瀏覽器等一些操作,以影響自己的成績來震懾他們,但是最後發生的問題還是...