我希望你是我独家记忆

一段永远封存的记忆,随风而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

HLOJ_1040

Posted on 2009-06-29 15:35 Hero 阅读(154) 评论(0)  编辑 收藏 引用 所属分类: 代码如诗--ACM
 1 //HLOJ 1040  Accepted  31 3716 761 C++  
 2 
 3 //分层的动态规划
 4 //倒序可能更简单 -- 避免干扰
 5 
 6 #include <iostream>
 7 
 8 using namespace std ;
 9 
10 const int size = 30 ;
11 int money[size] ;
12 
13 int inn ;
14 int inm ;
15 
16 int dp[size][30000] ;
17 int flag[30000] ;
18 
19 int main()
20 {
21     /*while( cin >> inn && inn ) 
22     {
23         memset( dp, 0, sizeof(dp) ) ;
24 
25         for( int i=1; i<=inn; i++ ) cin >> money[i] ;
26 
27         cin >> inm ;
28 
29         dp[0][0] = 1 ;
30         int total = 0 ;
31         for( int i=1; i<=inn; i++ )        
32         {
33             for( int j=0; j<=total; j++ )
34             {
35                 if( dp[i-1][j] )
36                 {
37                     dp[i][j] = 1 ;
38                     if( j + money[i] <= inm )
39                     {
40                         dp[i][j+money[i]] = 1 ;
41                     }
42                 }
43             }
44             total += money[i] ;
45         }
46 
47         int ans = 0 ;
48         for( int j=inm; j>=0; j-- )
49         {
50             if( dp[inn][j] )
51             {
52                 ans = j ; break ;
53             }
54         }
55 
56         printf( "%d\n", ans ) ;
57     }*/
58 
59     while( cin >> inn )
60     {
61         forint i=1; i<=inn; i++ ) cin >> money[i] ;
62         cin >> inm ;
63 
64         memset( flag, 0sizeof(flag) ) ;
65 
66         int total = 0 ; flag[0= 1 ;
67         forint i=1; i<=inn; i++ )
68         {
69             forint j=total; j>=0; j-- )
70             {
71                 if( flag[j] && j+money[i]<=inm )
72                 {
73                     flag[j+money[i]] = 1 ;
74                 }
75             }
76             total += money[i] ;
77 
78         }
79 
80         int ans = 0 ;
81         forint i=inm; i>=0; i-- )
82         {
83             if( flag[i] )
84             {
85                 ans = i ; break ;
86             }
87         }
88 
89         cout << ans << endl ;
90     }
91 
92     return 0 ;
93 }

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理