hdu1712ACboy needs your help( dp )

题目大意就是给出 N门课, 然后给出每门课花m天的收益,问在天数一定的情况下最大收益

 

ans[x][r] 表示前x节课在r天的情况下的最佳情况

for ( int i= 0, r)

ans[x][r] = max( ans[x][r] , ans[x+1][r-i] + cl[x][i])

用了for和dfs两种方法写

 

题目:

ACboy needs your help

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3368    Accepted Submission(s): 1742


Problem Description
ACboy has N courses this term, and he plans to spend at most M days on study.Of course,the profit he will gain from different course depending on the days he spend on it.How to arrange the M days for the N courses to maximize the profit?
 

 

Input
The input consists of multiple data sets. A data set starts with a line containing two positive integers N and M, N is the number of courses, M is the days ACboy has.
Next follow a matrix A[i][j], (1<=i<=N<=100,1<=j<=M<=100).A[i][j] indicates if ACboy spend j days on ith course he will get profit of value A[i][j].
N = 0 and M = 0 ends the input.
 

 

Output
For each data set, your program should output a line which contains the number of the max profit ACboy will gain.
 

 

Sample Input
2 2 1 2 1 3 2 2 2 1 2 1 2 3 3 2 1 3 2 1 0 0
 

 

Sample Output
3 4 6
 

 

Source
 

 

Recommend
lcy
 
代码:
 1 //Sat Jan 11 18:55:27 2014
 2 //Author:Minshik
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <string>
 8 #include <vector>
 9 #include <set>
10 #include <stack>
11 #include <queue>
12 #include <deque>
13 #include <memory.h>
14 #include <cctype>
15 #include <cmath>
16 #include <list>
17 using namespace std;
18 
19 int TIAN,KE;
20 int cl[105][105];
21 int ans[105][110];
22 
23 #define REP(i,N) for(int i=0;i<N;i++)
24 
25 int dfs(int x,int r)
26 {
27     if(ans[x][r]) return ans[x][r];
28 
29     if(x==KE)return 0;
30 
31     int &d = ans[x][r];
32 
33     d = dfs(x+1,r);
34 
35     for(int i=1;i<=r;i++)
36     {
37         d = max(d,dfs(x+1,r-i)+cl[x][i-1]);
38     }
39     return d;
40 
41 }
42 int main()
43 {
44 
45     while(cin>>KE>>TIAN && KE+TIAN!=0)
46     {
47         REP(i,KE)REP(j,TIAN)
48                 cin>>cl[i][j];
49 
50 
51 
52         for(int i=1;i<=TIAN;i++)
53         {
54             for(int j=1;j<=KE;j++)
55             {
56                  ans[j][i] = ans[j-1][i];
57                 for(int k=1;k<=i;k++)
58                 {
59                      ans[j][i] = max (ans[j][i], ans[j-1][i-k] +cl[j-1][k-1] );
60                 }
61 
62             }
63         }
64 
65 
66 
67 
68         cout<<ans[KE][TIAN]<<endl;
69 
70 
71     }
72 
73 
74     return 0;
75 }

 

posted @ 2014-01-11 23:28  doubleshik  阅读(136)  评论(0编辑  收藏  举报