shu_1299 vijos 1037(搭建双塔)

http://202.121.199.212/JudgeOnline/problem.php?cid=1078&pid=7

分析: 经典DP题

dp[ i ][ j ]:前i个水晶搭建的高度差为 j 的双塔中较高塔的高度;

dp[ i ][ j ] = d[ i-1 ][ j ]  ,                       不放第i个水晶;

dp[ i ][ j ] = f[ i-1 ][ h[i]-j ] + j,               第i个水晶放在较矮的塔上,原来较矮的塔变成较高的塔;

dp[ i ][ j ] = f[ i-1 ][ h[i]+j ],                    第i个水晶放在较矮的塔上,原来较矮的塔还是较矮的塔;

dp[ i ][ j ] = f[ i-1 ][ j-h[i] ] + h[ i ],          第i个水晶放在较高的塔上,原来较高的塔变成更高的塔;

(可以画个图,转移方程就出来了)

代码:

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;

int h[120];
int dp[120][2400];

int mmax(int a,int b)
{
    return a<b ? b:a;
}

int main()
{
    //freopen("in.txt","r",stdin);

    int n;
    int sum=0;
    scanf("%d",&n);
    memset(dp, -1, sizeof(dp));
    dp[0][0]=0;

    for(int i=1;i<=n;i++) {scanf("%d",&h[i]); sum +=h[i];}

    for(int i = 1; i <=n; i++) {
        for(int j = 0; j <= sum; j++) {
            if(dp[i-1][j]>-1)
               dp[i][j]=dp[i-1][j];
            if(h[i]>j && dp[i-1][h[i]-j]>-1)
               dp[i][j]=mmax(dp[i][j],dp[i-1][h[i]-j]+j);
            if(j+h[i]<=sum && dp[i-1][j+h[i]]>-1)
               dp[i][j]=mmax(dp[i][j],dp[i-1][j+h[i]]);
            if(j>=h[i] && dp[i-1][j-h[i]]>-1)
               dp[i][j]=mmax(dp[i][j],dp[i-1][j-h[i]]+h[i]);
        }
    }
    if(dp[n][0] > 0)   printf("%d\n",dp[n][0]);
    else               printf("Impossible\n");
    return 0;
}

shu_1299 vijos 1037(搭建双塔)

时间: 2024-08-07 08:37:57

shu_1299 vijos 1037(搭建双塔)的相关文章

vijos 1037 搭建双塔 【DP】

% 这题是小猫给我讲的 % 题目: Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建.但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少.所以他来请你帮忙. 给定水晶的数量N(1≤N≤100)和每块水晶的高度Hi(N块水晶高度的总和不超过2000),你的任务是判断Mr. F能否用这些水晶搭建成一座双塔(两座塔有同样的高度),如果能,则输出所能搭建

vijos P1037搭建双塔

P1037搭建双塔 Accepted 标签:动态规划 背包 描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建.但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少.所以他来请你

VIJOS P1037搭建双塔[DP]

描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建.但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少.所以他来请你帮忙. 给定水晶的数量N(1≤N≤100)和每块水晶的高度H

搭建双塔(codevs 1037)

描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建.但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少.所以他来请你帮忙. 给定水晶的数量N(1≤N≤100)和每块水晶的高度H

tyvj1114 搭建双塔

描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔.    Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建.但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少.所以他来请你帮忙.    给定水晶的数量N(1≤N≤100)和每块

vijosP1037搭建双塔

链接:https://vijos.org/p/1037 [思路] DP. [代码] 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 const int maxn = 100+10; 6 7 int a[maxn]; 8 int d[maxn][2010]; 9 int n,sum; 10 11 int main() { 12 ios::sync_with_stdio(false); 13 cin

vijos 1037 背包+标记

描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建.但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少.所以他来请你帮忙. 给定水晶的数量N(1≤N≤100)和每块水晶的高度H

Laoj P1299 搭建双塔

试题描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念"9?11"事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建.但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少.所以他来请你帮忙. 给定水晶的数量N(1≤N≤100)和每

18.03.12 vijos1037搭建双塔

描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建.但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少.所以他来请你帮忙. 给定水晶的数量N(1≤N≤100)和每块水晶的高度H