九度 题目1453:Greedy Tino

题目描述:

Tino wrote a long long story. BUT! in Chinese...

So I have to tell you the problem directly and discard his long long story. That is tino want to carry some oranges with "Carrying pole", and he must make two side of the Carrying pole are the same weight. Each orange have its‘ weight. So greedy tino want to
know the maximum weight he can carry.

输入:

The first line of input contains a number t, which means there are t cases of the test data.

for each test case, the first line contain a number n, indicate the number of oranges.

the second line contains n numbers, Wi, indicate the weight of each orange

n is between 1 and 100, inclusive. Wi is between 0 and 2000, inclusive. the sum of Wi is equal or less than 2000.

输出:

For each test case, output the maximum weight in one side of Carrying pole. If you can‘t carry any orange, output -1. Output format is shown in Sample Output.

样例输入:
1
5
1 2 3 4 5
样例输出:
Case 1: 7
动态规划算法解决,转移方程如下:
方程含义是:在前i个物品中进行选择,分为两堆,第一堆比第二堆重j千克时,两堆加起来的最大总重量!(注意:j可以为负数)
代码如下:
#include <stdio.h>
#include <string.h>
#define OFFSET 2000//因为j有正负,所以添加一个偏移量,方便做题
#define INF 0x7fffffff
int wi[101];
int dp[101][4001];
int max(int a, int b, int c){
    int flag = a;
    if(flag < b){
        flag = b;
    }
    if(flag < c){
        flag = c;
    }
    return flag;
}
void init()
{
    for(int i=0;i<40001;i++)
            dp[0][i] = -INF;
    dp[0][OFFSET] = 0;//core
}
int main(){
    int t, n;
    scanf("%d", &t);
    for(int i = 0; i < t; i++){
        scanf("%d", &n);
        wi[0] = 0;
         bool hasZero = false;
        int cnt = 0;
        for(int j = 0; j < n; j++){
            scanf("%d", &wi[++cnt]);
            if(wi[cnt] == 0){
                   hasZero = true;
                   cnt--;
            }
        }
        n = cnt;
        init();
        for(int j = 1; j <= n; j++){
            for(int k = -2000; k <= 2000; k++){
                dp[j][k+OFFSET] = max(dp[j-1][k-wi[j]+OFFSET]+wi[j], dp[j-1][k+wi[j]+OFFSET]+wi[j], dp[j-1][k+OFFSET]);
            }
        }
        printf ("Case %d: ", i+1);
        if(dp[n][0+OFFSET] == 0){
            if(hasZero == true){
                printf("0\n");
            }else{
                printf("-1\n");
            }
        }else{
            printf("%d\n", dp[n][0+OFFSET]/2);
        }
    }
    return 0;
}

时间: 2024-07-30 09:39:52

九度 题目1453:Greedy Tino的相关文章

九度 题目1335:闯迷宫 题目1365:贝多芬第九交响曲

转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/40718149 简单说说宽度优先搜索BFS 说实话,这是第一个自己写的宽度优先搜索的题目,之前也是不太明白之间的区别,好吧,只能说自己学的太渣-- 言归正传,对于初学者来说,可能最大的概念就是一个是深度搜索,一个是宽度搜索,好吧,我表示废话了,我其实就是这个样子的,然后一直不得甚解...所以第一次上来,我就直接搜索DFS,结果太明显,就是TLE或者MLE,然后就抓狂中,这可能是

九度 题目1123:采药

题目描述: 辰辰是个很有潜能.天资聪颖的孩子,他的梦想是称为世界上最伟大的医师. 为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题. 医师把他带到个到处都是草药的山洞里对他说: "孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值. 我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大." 如果你是辰辰,你能完成这个任务吗? 输入: 输入的第一行有两个整数T(1 <=

九度 题目1122:吃糖果

题目描述: 名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0). 妈妈告诉名名每天可以吃一块或者两块巧克力. 假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案. 例如: 如果N=1,则名名第1天就吃掉它,共有1种方案: 如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案: 如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案: 如果N=4,则名名可以

九度 题目1205:N阶楼梯上楼问题

题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括一个整数N,(1<=N<90). 输出: 可能有多组测试数据,对于每组数据, 输出当楼梯阶数是N时的上楼方式个数. 样例输入: 4 样例输出: 5 分析:第n阶台阶的方法等于上到第n-1阶台阶的方法加上第n-2阶的台阶的方法之和,因为89阶的时候已经超过2的32次方,所以用long long int 代码如下: #include <stdio.h> long long int

九度 题目1448:Legal or Not

判断是否存在环的问题,本文采用的是拓扑排序,如果输出的节点少于N,则形成了环,和之前的1449几乎是一样的代码 题目链接http://ac.jobdu.com/problem.php?pid=1448 转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/41226369 #include <iostream> #include <memory.h> #include <queue> using names

九度 题目1449:确定比赛名次

很明显的拓扑排序问题,绘制成图之后会发现很好理解,刚开始我自己也不是很理解,画图之后思路特别清晰 转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/41226221 题目链接http://ac.jobdu.com/problem.php?pid=1449 #include <iostream> #include <memory.h> #include <queue> using namespace st

九度-题目1011:最大连续子序列

题目描述:     给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K.最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20.现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素. 输入: 测试输入包含若干测试用例,每个测试用例占2行,第1行给出

九度 题目1451:不容易系列之一

题目描述: 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好"一件"事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样. 话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的.比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把40个单项选择题全部做错了!大家都学过概率论,应该知道出现这种情况的概率,所以至今我都觉得这是一件神奇的事情.如果套用一句经典的评语,我们可以这样总结:一个人做错一道选择题并不难

九度 题目1045:百鸡问题

题目描述: 用小于等于n元去买100只鸡,大鸡5元/只,小鸡3元/只,还有1/3元每只的一种小鸡,分别记为x只,y只,z只.编程求解x,y,z所有可能解. 输入: 测试数据有多组,输入n. 输出: 对于每组输入,请输出x,y,z所有可行解,按照x,y,z依次增大的顺序输出. 样例输入: 40 样例输出: x=0,y=0,z=100 x=0,y=1,z=99 x=0,y=2,z=98 x=1,y=0,z=99 代码如下,一开始用了三重循环,后来稍微优化了一下,改成了两重循环: 三重循环的代码: #