1290:采药

http://ybt.ssoier.cn:8088/problem_show.php?pid=1290

大爆搜DFS写法(30分)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int t, m, a[105][2], ans;
 4 void dfs(int s, int ti, int val){
 5     if(s>=m+1){
 6         ans=max(ans, val);
 7         return;
 8     }
 9     dfs(s+1, ti, val);
10     if(ti+a[s][0] <= t)
11         dfs(s+1, ti+a[s][0], val+a[s][1]);
12 }
13 int main()
14 {
15     scanf("%d%d", &t, &m);
16     for(int i=1; i<=m; i++)
17         scanf("%d%d", &a[i][0], &a[i][1]);
18     dfs(1, 0, 0);
19     printf("%d", ans);
20     return 0;
21 } 

记忆化搜索(100)

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int INF=1<<30;
 4 int n,t;
 5 int tcost[103],mget[103];
 6 int mem[103][1003];
 7 int dfs(int pos,int tleft){
 8     if( mem[pos][tleft] != -1 ) return mem[pos][tleft];
 9     if(pos == n+1)
10         return mem[pos][tleft] = 0;
11     int dfs1,dfs2 = -INF;
12     dfs1 = dfs(pos+1,tleft);
13     if( tleft >= tcost[pos] )
14         dfs2 = dfs(pos+1,tleft-tcost[pos]) + mget[pos];
15     return mem[pos][tleft] = max(dfs1,dfs2);
16 }
17 int main(){
18     memset(mem,-1,sizeof(mem));
19     cin >> t >> n;
20     for(int i = 1;i <= n;i++)
21         cin >> tcost[i] >> mget[i];
22     cout << dfs(1,t) << endl;
23     return 0;
24 }

 

 

 

01背包(100)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int t, m, a[105][2], dp[105][1005];
 4 int main()
 5 {
 6     scanf("%d%d",&t, &m);
 7     for(int i=1; i<=m; i++)
 8         scanf("%d%d", &a[i][0], &a[i][1]);
 9     for(int i=1; i<=m; i++)
10         for(int j=0; j<=t; j++)
11             if(j>=a[i][0])dp[i][j]=max(dp[i-1][j], dp[i-1][j-a[i][0]]+a[i][1]);
12             else dp[i][j]=dp[i-1][j];    
13     printf("%d", dp[m][t]);
14     return 0;
15  } 

 

posted @ 2021-05-16 09:51  TFLSNOI  阅读(344)  评论(0编辑  收藏  举报