Day 3 DP

1. P1015 精卫填海

01背包 + 判断

 1 #include <iostream>
 2 using namespace std;
 3 const int MAXN = 10100, MAXV = 10100;
 4 int v, n, m, f[MAXV], w[MAXN], c[MAXN];//f[i]为消耗体力为i时最大的石头体积 
 5 int main()
 6 {
 7     cin >> v >> n >> m; 
 8     for(int i = 1; i <= n; ++i)
 9         cin >> c[i] >> w[i];
10     for(int i = 1; i <= n; ++i)
11         for(int j = m; j >= w[i]; --j)
12             f[j] = max(f[j], f[j - w[i]] + c[i]);
13     for(int i = 1; i <= m; ++i)
14         if(f[i] >= v)
15         {
16             cout << m - i << endl;
17             return 0;
18         }
19     cout << "Impossible" << endl;
20     return 0;
21 } 
View Code

2. P1507 NASA的食物

类似于01背包,但相比01背包的唯一的体积(或质量)的限制条件增加了质量(或体积)

 1 #include <iostream>
 2 using namespace std;
 3 const int MAXN = 410, MAXM = 410, MAXK = 60;
 4 int m, n, k, f[MAXN][MAXM], a[MAXK], b[MAXK], c[MAXK];
 5 int main()
 6 {
 7     cin >> m >> n >> k;
 8     for(int i = 1; i <= k; ++i)
 9         cin >> a[i] >> b[i] >> c[i];
10     for(int i = 1; i <= k; ++i)
11         for(int u = m; u >= a[i]; --u)
12             for(int v = n; v >= b[i]; --v)
13                 f[u][v] = max(f[u][v], f[u - a[i]][v - b[i]] + c[i]);
14     cout << f[m][n] << endl;
15     return 0;
16 }
View Code

 

 

 

By ZRQ

posted @ 2020-03-04 22:27  ZRQ666  阅读(113)  评论(0编辑  收藏  举报