母函數用多重背包來解

來源:互聯網
上載者:User

其實母函數基本都可以用多重背包來解,我在做母函數時,My Code500多MS有的甚至過不了,而cadl神的是0MS,就倍感驚訝啊,我的逾時,為神馬別人的那麼少啊,一問原來是用背包做的,這裡來講一講母函數用背包做的一點小理解吧,以HDU 1284為例,dp[j]代表著錢為j時的選法,當迴圈到第i次時,(即前面的coin[1,2....i-1]已經選完了 )對於j有兩種選法,一:不選coin[i],那麼它的選法就是原來不選coin[i]的選法dp[j],選coin[i]的選法有多少種呢???? 不就是dp[j-coin[i]] ( 為神馬是這樣呢?因為你如果在j那裡選了coin[i],那麼他選coin[i]的選法就有dp[j-coin[i]]種 )的選法嗎?  所以當有coin[i]這種硬幣時,dp[j]的選法就有dp[j] + dp[j - coin[i] ]種。這裡其實是DP的思想每次都是考慮當前這一個,假設前面的已經算好了,只要考慮這一個跟前面那一個就行了。over 思考半小時就行了。

#include<stdio.h>#include<string.h>int coin[4] = { 0 , 1, 2 , 3},dp[32780],n;void DP(  ){     memset( dp,0,sizeof( dp ) );     dp[0] = 1;     for( int i = 1; i <= 3; ++i )          for( int j = coin[i]; j <= n; ++j )               dp[j] += dp[j-coin[i]];//這裡與一般的背包不同     printf( "%d\n",dp[n] );//這裡就是找這一個跟前面那一個的關係 }int main( ){    while( scanf( "%d",&n ) != EOF )           DP(  );    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.