Sicily 1342. 开心的金明
2014-10-27 19:47
501 查看
// 参考《背包九讲》
// 利用二维决策表的一般写法 #include <iostream> #include <cstring> #include <algorithm> using namespace std; int v[26], p[26], dp[26][30030]; int main(int argc, char **argv) { int N, m; while (cin >> N >> m) { for (int i = 0; i < m; i++) cin >> v[i] >> p[i]; memset(dp, 0, sizeof(dp)); // 初始状态 for (int i = v[0]; i <= N; i++) dp[0][i] = v[0] * p[0]; // 状态转移,经典背包公式 for (int i = 1; i < m; i++) for (int j = 0; j <= N; j++) { if (j >= v[i]) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + v[i] * p[i]); else dp[i][j] = dp[i - 1][j]; } // 构成j的关于v的集合存在时,dp[][j]有意义->最大值不一定是dp[m-1] ,应为max{dp[] } cout << *max_element(dp[m - 1], dp[m - 1] + N + 1) << endl; } return 0; }
// 从后向前的递推。未知子状态用0占位,随后更新 #include <iostream> #include <algorithm> using namespace std; int dp[30030], v[30], p[30]; int main(int argc, char **argv) { int n, m; while (cin >> n >> m) { for (int i = 0; i <= n; i++) dp[i] = 0; for (int i = 0; i < m; i++) cin >> v[i] >> p[i]; // 加入新的物品信息后据此更新整个dp[] for (int i = 0; i < m; i++) for (int j = n; j >= v[i]; j--) dp[j] = max(dp[j], dp[j - v[i]] + v[i] * p[i]); cout << dp << endl; } return 0; }
相关文章推荐
- [sicily]1342. 开心的金明
- Sicily 1342 开心的金明
- sicily 1342 开心的金明 DP
- Sicily 1342. 开心的金明
- sicily 1342. 开心的金明
- sicily 1342. 开心的金明
- 第六周:( Sicily1342) 开心的金明(c++)
- sicily 1342 开心的金明
- ( Sicily1342) 开心的金明(week 8)
- sicily 1342 开心的金明
- Sicily.1342.开心的金明&&Sicily.1146.采药
- 1342. 开心的金明
- rqnoj 2 开心的金明
- PID2 / 开心的金明
- 1115 开心的金明和P1104采药
- P1060 开心的金明
- 2006年分区联赛普级组之二 开心的金明
- 开心的金明
- 算法训练 开心的金明
- 【求助】Java实现 开心的金明问题