24h購物| | PChome| 登入
2009-03-26 19:14:45| 人氣1,657| 回應3 | 上一篇 | 下一篇

2009 TOI 研習營初選 第四題:分房子

推薦 0 收藏 0 轉貼0 訂閱站台

這題是DP的1種 零錢問題!

/***********************************************************/

#include<stdlib.h>     
#include<stdio.h>     
main()     
{     
 long long int cost[400]={0},m=0;  
 long long int money[751]={0},a,b;
 int n;  
 money[0]=1;
 for(a=1;a<750;a=a+2,m++)
  cost[m]=a;
 for(a=0;a<m;a++)  
  for(b=cost[a];b<=750;b++)  
   money[b]=money[b]+money[b-cost[a]];
 while(scanf("%d",&n)==1)
  while(n--)
   {
    scanf("%lld",&m);
    printf("%lld\n",money[m]);
   }
 return 0;         
}

台長: 來源不明
人氣(1,657) | 回應(3)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: 資訊競賽 |
此分類下一篇:NOIP2004 提高組 2.合并果子
此分類上一篇:2009 TOI 研習營初選 第三題:書

您好,想請問一下...
for(a=1;a<750;a=a+2,m++)
cost[m]=a;
這段的目的是在先把能分房子的數量列出來嗎?
2009-08-26 15:59:53
版主回應
是這樣子的沒錯
2009-08-26 17:47:36
然後想請問一下這段:
for(a=0;a<m;a++)
for(b=cost[a];b<=750;b++)
money[b]=money[b]+money[b-cost[a]];
我仍不太了解為什麼這樣能寫出讓money[b]算出有b棟時能夠有幾種方法?尤其是在money[b-cost[a]]這個完全看不懂...
2009-08-26 16:02:06
版主回應
這個就比較特殊了,不過仔細想想其實應該不算難。
你想想看
假如我有以下的組合,這些組合的值皆是Y
?+?+?
?+?
?
之後加上一個X值
?+?+?+X
?+?+X
?+X
那麼這些東西...就會變成X+Y值的組合(累加的)。
我是這麼想啦,順序要對,要給起始的值 (遞迴都是這個樣子的)。
2009-08-26 17:52:14
以及想請問一下...這種動態規劃的題目該怎麼練?在做完部分的基礎題庫之後來做資訊競賽的感覺難度一下子的大幅增加~不知道該念什麼書或是有需要做什麼加強呢?以及若我只單學C語言是否足夠用來應付競賽?是否需要再多學C++?謝謝
2009-08-26 16:04:24
版主回應
資訊競賽的很多題目,C沒辦法寫是因為無法紀錄節點的連結(用list可能會有點慢),所以要用C++的內建較為方便。(如果測資小的話,我會用陣列版的相鄰矩陣!),堅持手動暴力!!(目前)
動態規劃的題目啊...我目前只有用過零錢問題,背包問題的,其餘的都是仔細想過,依照順序不斷的更新答案,不知不覺就成為你們口中的 DP
我個人推薦是先把排序*(除了泡泡以外)以及遞迴的深入了解練好,
所謂的深入了解就是...DFS 因為大部分暴力的題目都可以這樣做,剩下的題目大概就是需要特殊的演算法吧...我也沒寫很多...也一堆不會 * 或者是要抓到題目的KEY (例如: 轉成二進位就出來之類的)
其實這些問我也不太好...因為我幾乎不上課狀態在寫題目,問我...似乎不是對的答案
很多題目的解答,都是別人提供的,或者上網找KEY...我個人是非常弱的
2009-08-26 18:01:28
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文