Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h_i (1 <= h_i <= 100) and is available in quantity c_i (1 <= c_i <= 10). Due to possible damage caused by cosmic rays, no part of a block of type i can exceed a maximum altitude a_i (1 <= a_i <= 40000).
Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.
Input
* Line 1: A single integer, K
* Lines 2..K+1: Each line contains three space-separated integers: h_i, a_i, and c_i. Line i+1 describes block type i.
Output
* Line 1: A single integer H, the maximum height of a tower that can be built
Sample Input
3
7 40 3
5 23 8
2 52 6
Sample Output
48
Hint
OUTPUT DETAILS:
From the bottom: 3 blocks of type 2, below 3 of type 1, below 6 of type 3. Stacking 4 blocks of type 2 and 3 of type 1 is not legal, since the top of the last type 1 block would exceed height 40.
修空间站, 有3个方块,接下来三行描述每个方块的高度,限定当前高度(意思是该方块能够放到的最大高度,若最大超过限高,则不能放),数量
因为最大容量40000,显而易见的多重背包,这里用比较特殊的优化方式
dp[i][j]表示前i个方块,堆到j的高度,第i个方块剩余的个数,-1表示堆不到,
//
// Create by Running Photon on 2015-03-14
//
#include
<iostream>
#include
<cstdio>
#include
<cstring>
#include
<cmath>
#include
<cstdlib>
#include
<iomanip>
#include
<algorithm>
#include
<cctype>
#include
<stack>
#include
<queue>
#include
<map>
#include
<string>
#include
<set>
#include
<vector>
using
namespace std
;
#define
CLR
(x
)
memset
(x
,
0
,
sizeof x
)
#define ll
long
long
const
int inf
=
0x3f3f3f3f
;
const
int maxn
=
4e4+5
;
const
int MOD
=
4e4
;
int dp
[maxn
];
int n
, a
[
405
], exc
[
405
], c
[
405
];
struct
pnt
{
int a
, exc
, c
;
}num
[
405
];
bool
cmp
(
pnt
x
,
pnt
y
)
{
return x
.exc
< y
.exc
;
}
int
main
()
{
#ifdef LOCAL
freopen
(
"in.txt"
,
"r"
,stdin
);
//freopen("out.txt","w",stdout);
#endif
ios_base
::
sync_with_stdio
(
0
);
while
(
scanf
(
"%d"
,
&n
)
!= EOF
)
{
for
(
int i
=
1
; i
<= n
; i
++)
scanf
(
"%d%d%d"
,
&num
[i
].a
,
&num
[i
].exc
,
&num
[i
].c
);
sort
(num
+
1
, num
+ n
+
1
, cmp
);
memset
(dp
,
-
1
,
sizeof dp
);
dp
[
0
]
=
0
;
for
(
int i
=
1
; i
<= n
; i
++)
for
(
int j
=
0
; j
<= MOD
; j
++)
{
if
(j
> num
[i
].exc
)
break
;//限制,无法堆砌条件
if
(dp
[j
]
>=
0
) dp
[j
]
= num
[i
].c
;
else
if
(dp
[j
- num
[i
].a
]
<=
0
|| j
< num
[i
].a
) dp
[j
]
=
-
1
;
else dp
[j
]
= dp
[j
- num
[i
].a
]
-
1
;
}
int ans
=
0
;
for
(
int i
=
0
; i
<= MOD
; i
++)
{
if
(dp
[i
]
>=
0
) ans
=
max
(ans
, i
);
}
printf
(
"%d
\n
"
, ans
);
}
return
0
;
}
Description
The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h_i (1 <= h_i <= 100) and is available in quantity c_i (1 <= c_i <= 10). Due to possible damage caused by cosmic rays, no part of a block of type i can exceed a maximum altitude a_i (1 <= a_i <= 40000).
Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.
Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.
Input
* Line 1: A single integer, K
* Lines 2..K+1: Each line contains three space-separated integers: h_i, a_i, and c_i. Line i+1 describes block type i.
* Lines 2..K+1: Each line contains three space-separated integers: h_i, a_i, and c_i. Line i+1 describes block type i.
Output
* Line 1: A single integer H, the maximum height of a tower that can be built
Sample Input
3
7 40 3
5 23 8
2 52 6
Sample Output
48
Hint
OUTPUT DETAILS:
From the bottom: 3 blocks of type 2, below 3 of type 1, below 6 of type 3. Stacking 4 blocks of type 2 and 3 of type 1 is not legal, since the top of the last type 1 block would exceed height 40.
修空间站, 有3个方块,接下来三行描述每个方块的高度,限定当前高度(意思是该方块能够放到的最大高度,若最大超过限高,则不能放),数量
因为最大容量40000,显而易见的多重背包,这里用比较特殊的优化方式
dp[i][j]表示前i个方块,堆到j的高度,第i个方块剩余的个数,-1表示堆不到,
//
// Create by Running Photon on 2015-03-14
//
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <algorithm>
#include <cctype>
#include <stack>
#include <queue>
#include <map>
#include <string>
#include <set>
#include <vector>
using namespace std ;
#define CLR (x ) memset (x , 0 , sizeof x )
#define ll long long
const int inf = 0x3f3f3f3f ;
const int maxn = 4e4+5 ;
const int MOD = 4e4 ;
int dp [maxn ];
int n , a [ 405 ], exc [ 405 ], c [ 405 ];
struct pnt
{
int a , exc , c ;
}num [ 405 ];
bool cmp ( pnt x , pnt y )
{
return x .exc < y .exc ;
}
int main ()
{
#ifdef LOCAL
freopen ( "in.txt" , "r" ,stdin );
//freopen("out.txt","w",stdout);
#endif
ios_base :: sync_with_stdio ( 0 );
while ( scanf ( "%d" , &n ) != EOF ) {
for ( int i = 1 ; i <= n ; i ++) scanf ( "%d%d%d" , &num [i ].a , &num [i ].exc , &num [i ].c );
sort (num + 1 , num + n + 1 , cmp );
memset (dp , - 1 , sizeof dp );
dp [ 0 ] = 0 ;
for ( int i = 1 ; i <= n ; i ++) for ( int j = 0 ; j <= MOD ; j ++) {
if (j > num [i ].exc ) break ;//限制,无法堆砌条件
if (dp [j ] >= 0 ) dp [j ] = num [i ].c ;
else if (dp [j - num [i ].a ] <= 0 || j < num [i ].a ) dp [j ] = - 1 ;
else dp [j ] = dp [j - num [i ].a ] - 1 ;
}
int ans = 0 ;
for ( int i = 0 ; i <= MOD ; i ++) {
if (dp [i ] >= 0 ) ans = max (ans , i );
}
printf ( "%d \n " , ans );
}
return 0 ;
}
From the bottom: 3 blocks of type 2, below 3 of type 1, below 6 of type 3. Stacking 4 blocks of type 2 and 3 of type 1 is not legal, since the top of the last type 1 block would exceed height 40.
修空间站, 有3个方块,接下来三行描述每个方块的高度,限定当前高度(意思是该方块能够放到的最大高度,若最大超过限高,则不能放),数量
因为最大容量40000,显而易见的多重背包,这里用比较特殊的优化方式
dp[i][j]表示前i个方块,堆到j的高度,第i个方块剩余的个数,-1表示堆不到,
//
// Create by Running Photon on 2015-03-14
//
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <algorithm>
#include <cctype>
#include <stack>
#include <queue>
#include <map>
#include <string>
#include <set>
#include <vector>
using namespace std ;
#define CLR (x ) memset (x , 0 , sizeof x )
#define ll long long
const int inf = 0x3f3f3f3f ;
const int maxn = 4e4+5 ;
const int MOD = 4e4 ;
int dp [maxn ];
int n , a [ 405 ], exc [ 405 ], c [ 405 ];
struct pnt
{
int a , exc , c ;
}num [ 405 ];
bool cmp ( pnt x , pnt y )
{
return x .exc < y .exc ;
}
int main ()
{
#ifdef LOCAL
freopen ( "in.txt" , "r" ,stdin );
//freopen("out.txt","w",stdout);
#endif
ios_base :: sync_with_stdio ( 0 );
while ( scanf ( "%d" , &n ) != EOF ) {
for ( int i = 1 ; i <= n ; i ++) scanf ( "%d%d%d" , &num [i ].a , &num [i ].exc , &num [i ].c );
sort (num + 1 , num + n + 1 , cmp );
memset (dp , - 1 , sizeof dp );
dp [ 0 ] = 0 ;
for ( int i = 1 ; i <= n ; i ++) for ( int j = 0 ; j <= MOD ; j ++) {
if (j > num [i ].exc ) break ;//限制,无法堆砌条件
if (dp [j ] >= 0 ) dp [j ] = num [i ].c ;
else if (dp [j - num [i ].a ] <= 0 || j < num [i ].a ) dp [j ] = - 1 ;
else dp [j ] = dp [j - num [i ].a ] - 1 ;
}
int ans = 0 ;
for ( int i = 0 ; i <= MOD ; i ++) {
if (dp [i ] >= 0 ) ans = max (ans , i );
}
printf ( "%d \n " , ans );
}
return 0 ;
}