Posted on 2009-07-01 10:32
Hero 阅读(133)
评论(0) 编辑 收藏 引用 所属分类:
代码如诗--ACM
1 //1039 Accepted 250 9660 1046 C++
2
3 //动态规划
4 /*
5 dp[i][j][k]表示在前i个怪物中,在体力消耗不超过j的情况下,选出不超过k个怪物
6 杀死它们所能得到的最大经验
7
8 dp[i][j][k] = fmax( dp[i-1][j][k], dp[i-1][j-w[i]][k-1]+v[i] ) ;
9 不选第i个怪物 选择第i个怪物
10
11 顺序动归,每一个怪物都有选与不选两种选择
12 */
13 #include <iostream>
14 using namespace std ;
15
16 int inn, inm, ink, ins ;
17
18 int w[200] ;
19 int v[200] ;
20 int dp[110][110][110] ;
21
22 int fmax( int a, int b )
23 {
24 return a > b ? a : b ;
25 }
26
27 int main()
28 {
29 while( cin >> inn >> inm >> ink >> ins )
30 {
31 for( int k=1; k<=ink; k++ )
32 {
33 cin >> v[k] >> w[k] ;
34 }
35
36 memset( dp, 0, sizeof(dp) ) ;
37
38 for( int k=1; k<=ins; k++ )
39 {
40 for( int j=0; j<=inm; j++ )
41 {
42 if( j >= w[1] )
43 {
44 dp[1][j][k] = v[1] ;
45 }
46 }
47 }
48
49 for( int i=2; i<=ink; i++ )
50 {
51 for( int k=1; k<=ins; k++ )
52 {
53 for( int j=0; j<=inm; j++ )
54 {
55 if( j >= w[i] )
56 {
57 dp[i][j][k] = fmax( dp[i-1][j][k], dp[i-1][j-w[i]][k-1]+v[i] ) ;
58 }
59 else
60 {
61 dp[i][j][k] = dp[i-1][j][k] ;
62 }
63 }
64 }
65 }
66
67 int ans = -1 ;
68 for( int j=0; j<=inm; j++ )
69 {
70 if( dp[ink][j][ins] >= inn )
71 {
72 ans = j ; break ;
73 }
74 }
75
76 if( ans < 0 )
77 printf( "%d\n", ans ) ;
78 else
79 printf( "%d\n", inm-ans ) ;
80 }
81 return 0 ;
82 }