Day 3 DP
1. P1015 精卫填海
01背包 + 判断
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
2. P1507 NASA的食物
类似于01背包,但相比01背包的唯一的体积(或质量)的限制条件增加了质量(或体积)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
By ZRQ