查看: 1907|回復: 12
打印 上一主題 下一主題

[解決] TOJ - 129

[複製鏈接]
  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-8-24 22:21:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    本帖最後由 jd3 於 2014-8-30 21:26 編輯




    我原本的想法是把 主件和對應的附件作成一組
    dp[ i ][ j ] 表示第 i 個主件有購買的情況下 j 元買到的最大價值
    然後把對應的附件在這上面做無限背包
    用前兩組的答案取max來做rolling , 變成dp[i%2][j]


    可是好像不太對=口=


    主件一定購買的情況下怎麼更新價值啊啊啊...


    <這是個人簽名欄位>
    回復

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-8-14 16:02
  • 簽到天數: 1 天

    [LV.1]初來乍到

    12

    主題

    138

    帖子

    863

    積分

    高級會員

    Rank: 4

    積分
    863

    台南一中資訊社新手達陣

    頭香
    發表於 2014-8-25 14:57:44 | 只看該作者
    給你個小提示:開兩條陣列做就好~~
    再一個小提示:其實做背包問題時連滾動都不用唷~
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    3#
     樓主| 發表於 2014-8-25 19:42:42 | 只看該作者
    本帖最後由 jd3 於 2014-8-25 19:49 編輯
    allenwhale 發表於 2014-8-25 14:57
    給你個小提示:開兩條陣列做就好~~
    再一個小提示:其實做背包問題時連滾動都不用唷~ ...

    我的描述好像沒有到位

    貼個code求救QAQ


    (啊啊我發現我錯誤了先刪CODE)
    <這是個人簽名欄位>
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-8-14 16:02
  • 簽到天數: 1 天

    [LV.1]初來乍到

    12

    主題

    138

    帖子

    863

    積分

    高級會員

    Rank: 4

    積分
    863

    台南一中資訊社新手達陣

    4#
    發表於 2014-8-25 19:59:15 | 只看該作者
    jd3 發表於 2014-8-25 19:42
    我的描述好像沒有到位

    貼個code求救QAQ

    你的想法方向沒錯
    但是有點小漏洞,例如你先用主件做01背包,再用做出來的結果作無限背包,但是你怎麼保證在座無限ˋ杯刀時用的的資訊是有拿主件的?因為01背包不保證一定有拿,所以不能只用一個陣列做

    點評

    還有輸出記得換行 再來就是小心變數,你變數很多地方都亂用(ex:價錢當數量...)  發表於 2014-8-25 20:00
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    5#
     樓主| 發表於 2014-8-25 20:13:51 | 只看該作者
    allenwhale 發表於 2014-8-25 19:59
    你的想法方向沒錯
    但是有點小漏洞,例如你先用主件做01背包,再用做出來的結果作無限背包,但是你怎麼保 ...


    嗯嗯 剛才發現了變數亂用的問題@@
    改完的CODE只對了部分測資...Orz

    [C++] 純文本查看 復制代碼
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    
    int n,m;
    int dp[2][2000000];	// dp[i][j] = 第 i(%2) 個 core 加入購買清單後 j 元的最大價值 
    int cost[128],value[128],core[128];
    
    
    int main()
    {
    	// Init
    	memset(dp, 0, sizeof(dp));
    	
    	scanf("%d%d", &n, &m);
    	
    	/*
    	cout << "money : " << n << endl;
    	cout << "item_count : " << m << endl;
    	*/
    	
    	// Input
    	for(int i = 1 ; i <= m ; i++)
    	{
    		scanf("%d%d%d", &cost[i], &value[i], &core[i]);
    		value[i] *= cost[i];
    	}
    	
    	
    	// Buttom-up
    	//	init
    	for(int i = 0 ; i < n ; i++)
    		dp[0][i] = 0;
    	int core_count = 0;
    	for(int i = 1 ; i <= m ; i++)
    	{
    		if(core[i] == 0)	// is core
    		{
    			core_count++;
    			int line = core_count%2;
    			
    			/*
    			cout << "process : line " << line << endl;
    			cout << "core = " << i << endl;
    			*/
    			
    			
    			for(int k = 0 ; k <= n ; k++)
    				cout << dp[line][k] << ",";
    			puts("");
    			
    			
    			for(int k = n ; k >= cost[i] ; k--)
    				dp[line][k] = dp[line][k-cost[i]] + value[i];
    				
    				
    			for(int k = 0 ; k <= n ; k++)
    				cout << dp[line][k] << ",";
    			
    			
    			
    			for(int k = 1 ; k <= m ; k++)
    			{
    				if(core[k] == i)
    				{
    				//	cout << "get part : " << k << endl;
    					for(int j = cost[k]+cost[i] ; j <= n ; j++)
    					{
    				//		printf("update[%d][%d]\n",line,j);
    						dp[line][j] = max ( dp[line][j], dp[line][j-cost[k]] + value[k] );
    					}
    				}
    			}
    			
    			
    		//	cout << "line " << 1-line << " = max ( line " << line << ", line" << 1-line << endl; 
    			for(int j = 0 ; j <= n ; j++)
    			{
    				dp[1-line][j] = max ( dp[1-line][j], dp[line][j] );
    			//	cout << dp[1-line][j] << ",";
    			}
    			
    		//	cout << endl;
    		
    		
    		
    			puts("\nafter sack");
    			for(int k = 0 ; k <= n ; k++)
    				cout << dp[line][k] << ",";
    			puts("\n-----------------------------------------------");
    			
    		}
    	}
    	
    //	cout << "print line : " << 1-core_count%2 << endl;
    	printf("%d",dp[1-core_count%2][n]);
    	
    	return 0;
    }
    

    點評

    因為這題跟zj題目不一樣啊  發表於 2014-8-25 20:37
    jd3
    我傳ZJ的  發表於 2014-8-25 20:36
    我沒看到你上傳怎麼知道只對了部分???  發表於 2014-8-25 20:16
    <這是個人簽名欄位>
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-8-14 16:02
  • 簽到天數: 1 天

    [LV.1]初來乍到

    12

    主題

    138

    帖子

    863

    積分

    高級會員

    Rank: 4

    積分
    863

    台南一中資訊社新手達陣

    6#
    發表於 2014-8-25 20:41:28 | 只看該作者
    而且你這樣做不覺得01背包不見了嗎
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    7#
     樓主| 發表於 2014-8-25 21:16:58 | 只看該作者
    allenwhale 發表於 2014-8-25 20:41
    而且你這樣做不覺得01背包不見了嗎

    我是想說陣列第 i-2 行 (mod 2)就是沒用過,陣列 i-1 行 (mod 2)  就是有用過 @@
    <這是個人簽名欄位>
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-8-14 16:02
  • 簽到天數: 1 天

    [LV.1]初來乍到

    12

    主題

    138

    帖子

    863

    積分

    高級會員

    Rank: 4

    積分
    863

    台南一中資訊社新手達陣

    8#
    發表於 2014-8-25 21:21:23 | 只看該作者
    但是這樣"只拿主件不拿附件"這種可能有可能會消失喔
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    9#
     樓主| 發表於 2014-8-30 01:49:26 | 只看該作者
    本帖最後由 jd3 於 2014-8-30 02:57 編輯

    .
    <這是個人簽名欄位>
    回復

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表