poj 2392 DP
2013-07-28 09:15
176 查看
首先按a从小到大排序,然后就是多重背包....注意优化.....
这一题要注意的是最大值不一定在 dp[n[i].a]初取到,因为有可能n[i].h和n[i].a很接近,导致只有一个从上一状态继承而来,而且还没有上一状态的最大值大....所以......要求最大值....
AC代码如下:
这一题要注意的是最大值不一定在 dp[n[i].a]初取到,因为有可能n[i].h和n[i].a很接近,导致只有一个从上一状态继承而来,而且还没有上一状态的最大值大....所以......要求最大值....
AC代码如下:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef struct{ int h, a, c; }Node; int comp( const void *a, const void *b ){ return (*(Node*)a).a - (*(Node*)b).a; } inline int max( int a, int b ){ return ( a > b ? a : b ); } int main(){ int N; Node n[400]; int dp[40001]; int maxi = 0; while( scanf( "%d", &N ) != EOF ){ for( int i = 0; i < N; i++ ){ cin >> n[i].h >> n[i].a >> n[i].c; } qsort( n, N, sizeof( Node ), comp ); memset( dp, 0, sizeof( dp ) ); dp[0] = 0; for( int i = 0; i < N; i++ ){ int k; for( k = 1; 2 * k - 1 < n[i].c; k *= 2 ){ for( int j = n[i].a; j >= k * n[i].h; j-- ){ if( dp[j-k*n[i].h] + k * n[i].h <= n[i].a ){ dp[j] = max( dp[j], dp[j-k*n[i].h] + k * n[i].h ); maxi = max( dp[j], maxi ); } } } k = n[i].c - k + 1; for( int j = n[i].a; j >= k * n[i].h; j-- ){ if( dp[j-k*n[i].h] + k * n[i].h <= n[i].a ){ dp[j] = max( dp[j], dp[j-k*n[i].h] + k * n[i].h ); maxi = max( dp[j], maxi ); } } } cout << maxi << endl; } return 0; }
相关文章推荐
- POJ 2392 简单dp 多重背包
- POJ 2392 Space Elevator [DP 多重背包]
- DP:Space Elevator(POJ 2392)
- POJ 2392 Space Elevator 贪心+dp
- POJ 2392 Space Elevator (dp)
- poj 2392 Space Elevator dp 多重背包
- POJ2392——Space Elevator(DP)
- poj 动态规划DP - 2392 Space Elevator
- Poj 2392(dp)
- POJ 2392 DP
- POJ 2392 DP
- POJ2392 SpaceElevator [DP]
- POJ 2392 Space Elevator (DP)
- poj 2392 dp 不是很懂哎!!!Space Elevator
- POJ 1948 (Triangular Pastures)二维背包 DP/DFS
- poj 3635 Full Tank? ( bfs+dp思想 )
- poj 3017 Cut the Sequence dp+单调队列优化
- poj 2955 Brackets (区间dp)||(记忆话搜素)
- POJ 3071 Football【概率DP】
- POJ 1163 The Triangle(数塔模型dp)