首页 技术 正文
技术 2022年11月9日
0 收藏 912 点赞 3,594 浏览 3669 个字
Time Limit: 15000/10000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit 
Status

The story happened long long ago. One day, Cao Cao made a special order called “Chicken Rib” to his army. No one got his point and all became

very panic. However, Cao Cao himself felt very proud of his interesting idea and enjoyed it.

Xiu Yang, one of the cleverest counselors of Cao Cao, understood the command Rather than keep it to himself, he told the point to the whole army.

Cao Cao got very angry at his cleverness and would like to punish Xiu Yang. But how can you punish someone because he’s clever? By looking at

the chicken rib, he finally got a new idea to punish Xiu Yang.

He told Xiu Yang that as his reward of encrypting the special order, he could take as many gold sticks as possible from his desk. But he could only

use one stick as the container.

Formally, we can treat the container stick as an L length
segment. And the gold sticks as segments too. There were many gold sticks with different

length ai and
value vi.
Xiu Yang needed to put these gold segments onto the container segment. No gold segment was allowed to be overlapped.

Luckily, Xiu Yang came up with a good idea. On the two sides of the container, he could make part of the gold sticks outside the container as long

as the center of the gravity of each gold stick was still within the container. This could help him get more valuable gold sticks.

As a result, Xiu Yang took too many gold sticks which made Cao Cao much more angry. Cao Cao killed Xiu Yang before he made himself home. So

no one knows how many gold sticks Xiu Yang made it in the container.

Can you help solve the mystery by finding out what’s the maximum value of the gold sticks Xiu Yang could have taken?

Input

The first line of the input gives the number of test cases, T(1≤T≤100). T test
cases follow. Each test case start

with two integers, N(1≤N≤1000)
and L(1≤L≤2000),
represents the number of gold sticks and the length

of the container stick. N lines
follow. Each line consist of two integers, ai(1≤ai≤2000)
and vi(1≤vi≤109),

represents the length and the value of the ith gold
stick.

Output

For each test case, output one line containing Case
#x: y
, where x is
the test case number (starting from 1)
and y is

the maximum value of the gold sticks Xiu Yang could have taken.

Sample input and output

Sample Input Sample Output
43 7
4 1
2 1
8 13 7
4 2
2 1
8 43 5
4 1
2 2
8 91 1
10 3
Case #1: 2
Case #2: 6
Case #3: 11
Case #4: 3

Hint

In the third case, assume the container is lay on x-axis
from 0 to 5.
Xiu Yang could put the second gold stick center at 0 and
put the third gold stick

center at 5,
so none of them will drop and he can get total 2+9=11 value.
In the fourth case, Xiu Yang could just put the only gold stick center

on any position of [0,1],
and he can get the value of 3

题意:给你一根长为m的长木板和一些小木棒,每一根小木棒有它的长度和价值,这些小木棒要放在长木板上并且每一根小木棒的重心要在长木板上

(即可以露出一半的长),问最大价值是多少。

思路:主要是dp方程要想到,用dp[i][j][k]表示处理到第i根木棒,长木板用了j的长度,有k根露在外面的最大价值,因为对于每根木棒,有三种情况,

一种是不放,一种是放在木板里面,还有一种是放在木板外面。这里注意要用滚动数组,不然会超内存。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
#define inf 0x7fffffff
#define maxn 4005
ll l[maxn],v[maxn];
ll dp[2][maxn*2][3];int main()
{
int n,m,i,j,T,len,cas=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
m*=2;
for(i=1;i<=n;i++){
scanf("%lld%lld",&l[i],&v[i]);
l[i]*=2;
} memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
//不放
for(j=0;j<=m;j++){
dp[1][j][0]=dp[0][j][0];
dp[1][j][1]=dp[0][j][1];
dp[1][j][2]=dp[0][j][2];
}
//放里面
for(j=m;j>=l[i];j--){
dp[1][j][0]=max(dp[1][j][0],dp[0][j-l[i] ][0]+v[i]);
dp[1][j][1]=max(dp[1][j][1],dp[0][j-l[i] ][1]+v[i]);
dp[1][j][2]=max(dp[1][j][2],dp[0][j-l[i] ][2]+v[i]);
}
//放外面
for(j=m;j>=l[i]/2;j--){
dp[1][j][1]=max(dp[1][j][1],dp[0][j-l[i]/2 ][0]+v[i]);
dp[1][j][2]=max(dp[1][j][2],dp[0][j-l[i]/2 ][1]+v[i]);
} for(j=0;j<=m;j++){
dp[0][j][0]=dp[1][j][0];
dp[0][j][1]=dp[1][j][1];
dp[0][j][2]=dp[1][j][2];
} }
ll ans=dp[1][m][0];
ans=max(ans,dp[1][m][1]);
ans=max(ans,dp[1][m][2]);
for(i=1;i<=n;i++){
ans=max(ans,v[i]);
}
cas++;
printf("Case #%d: %lld\n",cas,ans);
}
}

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,023
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,513
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,360
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,143
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,774
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,852