ACM: 动态规划题 poj&nb…
2016-05-19 23:25
399 查看
[align=center]Bookshelf 2[/align]
Description
Farmer John recently bought another bookshelf for the cow
library, but the shelf is getting filled up quite quickly, and now
the only available space is at the top.
FJ has N cows (1 ≤ N ≤ 20) each with some height
of Hi (1 ≤ Hi ≤ 1,000,000 -
these are very tall cows). The bookshelf has a height of B
(1 ≤ B ≤ S, where S is the sum of the heights
of all cows).
To reach the top of the bookshelf, one or more of the cows can
stand on top of each other in a stack, so that their total height
is the sum of each of their individual heights. This total height
must be no less than the height of the bookshelf in order for the
cows to reach the top.
Since a taller stack of cows than necessary can be dangerous,
your job is to find the set of cows that produces a stack of the
smallest height possible such that the stack can reach the
bookshelf. Your program should print the minimal 'excess' height
between the optimal stack of cows and the bookshelf.
Input
* Line 1: Two space-separated integers: N and
B
* Lines 2..N+1: Line i+1 contains a single integer:
Hi
Output
* Line 1: A single integer representing the (non-negative)
difference between the total height of the optimal set of cows and
the height of the shelf.
Sample Input
5 16
3
1
3
5
6
Sample Output
1
题意: 给出n个数, 要求出它们之中一部的和sum, 求出sum-S最小值.
解题思路:
1. 简单背包.
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 2000005
#define MAXSIZE 25
int n, S;
int dp[MAX];
int cost[MAXSIZE], sum;
inline int max(int a, int b)
{
return a > b ? a : b;
}
void DP()
{
for(int i = 1; i <= n; ++i)
{
for(int j = sum; j
>= cost[i]; --j)
{
dp[j] =
max(dp[j], dp[ j-cost[i] ]+cost[i]);
}
}
}
int main()
{
int i;
// freopen("input.txt", "r", stdin);
while(scanf("%d %d", &n,
&S) != EOF)
{
sum = 0;
for(i = 1; i <=
n; ++i)
{
scanf("%d",
&cost[i]);
sum +=
cost[i];
}
memset(dp, 0,
sizeof(dp));
DP();
for(i = S; i
<= sum; ++i)
{
if( i ==
dp[i] )
{
printf("%d\n",
i-S);
break;
}
}
}
return 0;
}
Description
Farmer John recently bought another bookshelf for the cow
library, but the shelf is getting filled up quite quickly, and now
the only available space is at the top.
FJ has N cows (1 ≤ N ≤ 20) each with some height
of Hi (1 ≤ Hi ≤ 1,000,000 -
these are very tall cows). The bookshelf has a height of B
(1 ≤ B ≤ S, where S is the sum of the heights
of all cows).
To reach the top of the bookshelf, one or more of the cows can
stand on top of each other in a stack, so that their total height
is the sum of each of their individual heights. This total height
must be no less than the height of the bookshelf in order for the
cows to reach the top.
Since a taller stack of cows than necessary can be dangerous,
your job is to find the set of cows that produces a stack of the
smallest height possible such that the stack can reach the
bookshelf. Your program should print the minimal 'excess' height
between the optimal stack of cows and the bookshelf.
Input
* Line 1: Two space-separated integers: N and
B
* Lines 2..N+1: Line i+1 contains a single integer:
Hi
Output
* Line 1: A single integer representing the (non-negative)
difference between the total height of the optimal set of cows and
the height of the shelf.
Sample Input
5 16
3
1
3
5
6
Sample Output
1
题意: 给出n个数, 要求出它们之中一部的和sum, 求出sum-S最小值.
解题思路:
1. 简单背包.
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 2000005
#define MAXSIZE 25
int n, S;
int dp[MAX];
int cost[MAXSIZE], sum;
inline int max(int a, int b)
{
return a > b ? a : b;
}
void DP()
{
for(int i = 1; i <= n; ++i)
{
for(int j = sum; j
>= cost[i]; --j)
{
dp[j] =
max(dp[j], dp[ j-cost[i] ]+cost[i]);
}
}
}
int main()
{
int i;
// freopen("input.txt", "r", stdin);
while(scanf("%d %d", &n,
&S) != EOF)
{
sum = 0;
for(i = 1; i <=
n; ++i)
{
scanf("%d",
&cost[i]);
sum +=
cost[i];
}
memset(dp, 0,
sizeof(dp));
DP();
for(i = S; i
<= sum; ++i)
{
if( i ==
dp[i] )
{
printf("%d\n",
i-S);
break;
}
}
}
return 0;
}
相关文章推荐
- ipvsadm-2 DR模式及自动检测后端服务器状态
- ACM: 动态规划题 poj 3211 背包变…
- ACM: 动态规划题 poj&nb…
- ACM: 动态规划题 poj 3659
- ACM: 动态规划题 poj 1192 树形DP
- ACM: 动态规划题 poj&nb…
- ACM: 动态规划题 poj 3140
- ACM: 动态规划题 poj 2486
- ACM: 动态规划题 poj 1947
- ACM: 动态规划题 poj 2057 树状DP
- ACM: 动态规划题 poj 1185 想了两…
- 兴趣学习: 摆脱“三天打渔两天晒网”…
- ACM: 动态规划题 poj 2411
- ACM: 动态规划题 poj 3254 学习状…
- ES使用脚本进行局部更新的排错记录 推荐
- ACM: 动态规划题 poj 3034
- (OK)(OK) Fedora23——NS3(MANETs)——Docker(busybox)——genymotion(android)——All is OK
- windows.h
- ACM: 动态规划题 poj 1925
- ACM: 动态规划题 poj 2948