UVA - 812 Trade on Verweggistan dfs + 贪心

题目大意:有n堆东西,只能从上往下买,如果要买下面的东西,只能把上面的所有东西买了才可以,类似一个栈

每个东西都有价格,每个东西卖出去都只能卖10,问能卖的最大利润,和要卖多少个才能达到最大利润

解题思路:贪心的来说每个买了的都要卖出去,才能使得利润最大化,纪录每堆卖出最大利润的所有情况,然后用dfs一一枚举,要判重和排序输出

注意特例,都是0的情况

1

5 10 10 10 10 10

输出应该有0 1 2 3 4 5

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 60
int w, price[maxn][25], sum, num[maxn], cnt, vis[2500],ans[2500];
struct Max {
    int cnt;
    int M[25];
    int num;
}MAX[maxn];

void init() {
    int Max = 0, sum2;
    sum = 0; cnt = 0;
    memset(vis,0,sizeof(vis));
    for(int i = 0; i < w; i++) {
        scanf("%d", &num[i]);
        sum += Max;
        sum2 = Max = 0;
        for(int j = 0; j < num[i]; j++) {
            scanf("%d", &price[i][j]);
            sum2 += 10 - price[i][j];
            Max = max(Max, sum2);
        }
        MAX[i].num = Max;
        MAX[i].cnt = 0;
    }

    sum += Max;
    for(int i = 0; i < w; i++) {
        sum2 = 0;
        if(MAX[i].num == 0)
            MAX[i].M[MAX[i].cnt++] = 0;
        for(int j = 0; j < num[i]; j++) {
            sum2 += 10 -price[i][j];
            if(sum2 == MAX[i].num)
                MAX[i].M[MAX[i].cnt++] = j + 1;
        }
    }
}

void dfs(int Sum, int cur) {
    if(cur == w && !vis[Sum]) {
        ans[cnt++] =  Sum;
        vis[Sum] = 1;
        return ;
    }

    for(int i = 0; i < MAX[cur].cnt; i++) {
        Sum += MAX[cur].M[i];
        dfs(Sum,cur+1);
        Sum -= MAX[cur].M[i];
    }
}

int main() {
    int cas = 0;
    while(scanf("%d", &w) == 1 && w) {
        if(cas)
            printf("\n");
        init();
        dfs(0,0);
        sort(ans,ans+cnt);
        printf("Workyards %d\n", ++cas);
        printf("Maximum profit is %d.\n", sum);
        printf("Number of pruls to buy:");
                for(int i = 0; i < cnt && i < 10; i++)
            printf(" %d", ans[i]);
        printf("\n");
    }
    return 0;
}
时间: 2024-10-09 19:23:30

UVA - 812 Trade on Verweggistan dfs + 贪心的相关文章

uva 812 Trade on Verweggistan

题意: 给w个货架, 每个货架上有bi个货物, 每次只能拿最上面的货物, 每个货物有个价值, 所有货物的售价均为10. 问:能获得的最大利润, 以及能获得这个利润需要多少个货物. (有多种组合时只需输出前10种) 思路: 最开始我是先将最大价值预处理了出来, 然后dfs查找方案数, 结果超时了, 后来发现复杂度是O(w*bi), 完全的暴力,可以先将每个货架的最大利润处理出来, 同时处理出来获得这个最大利润所需要的物品数. 后来又WA了几发, 第一次是发现自己没有处理如果利润为负时, 结果应该输

uva:10700 - Camel trading(贪心)

题目:10700 - Camel trading 题目大意:给出一些表达式,表达式由数字和加号乘号组成,数字范围[1,20].这些表达式可能缺少了括号,问这样的表达式加上括号后能得到的最大值和最小值. 解题思路:因为这些数的都是正整数,所以可以用贪心.不然看出最大值就是先做完加法在做乘法,最小值就是先做乘法在做加法.注意这里的数值要用long long 因为比表达式的值可能会超过int. 代码: #include <stdio.h> #include <string.h> cons

UVA 1016 - Silly Sort(置换分解+贪心)

UVA 1016 - Silly Sort 题目链接 题意:给定一个序列,数字都不同,每次可以交换两个数字,交换的代价为两数之和,要求出把这个序列变成递增最小代价 思路:利用置换的分解原理,可以把序列的每条循环单独考虑,对于每条循环而言,不断交换肯定每个数字至少会换到一次,再利用贪心的思想,如果每次拿循环中的最小值去置换,那么就是这个最小值会用长度-1次,而剩下的数字各一次,注意这里还有一种可能优的方法,就是先把整个序列中的最小值换到该循环中,等置换完再换出去,两种都考虑进来即可 代码: #in

ZOJ 2109 FatMouse&#39; Trade (背包 dp + 贪心)

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1109 FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean. The warehouse has N rooms. The i-th room contains J

·UVa」 11292 - Dragon of Loowater( 贪心 )

Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shores of Rellau Creek in central Loowater had always been a prime breeding ground for geese. Due to the lack of predato

uva :10123 - No Tipping(dfs + 几何力距 )

题目:uva :10123 - No Tipping 题目大意:给出l, m, n 分别表示 长度为l 的杠杆, 重量为 m, 有n个物体放在上方.问每次从上面挑选一个物品移除,是否能使杠杆继续平衡.这个过程中都可以的话,就输出移除顺序(不唯一) 否则就输出 impossible ,一开始,这个杠杆就不平衡的情况也会是有的.因为杠杆也是有重量的. 解题思路; 1.这题先前我就不明白什么怎么样的情况下,双支撑点的杠杆不平横,后面看了别人的报告才明白. 首先  我这里有两个支撑点 (1, 2) 左边

【bzoj4813】[Cqoi2017]小Q的棋盘 dfs+贪心

题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V个格点,编号为0,1,2-,V-1,它们是连通的,也就是说棋子从任意格点出发,总能到达所有的格点.小Q在设计棋盘时,还保证棋子从一个格点移动到另外任一格点的路径是唯一的.小Q现在想知道,当棋子从格点0出发,移动N步最多能经过多少格点.格点可以重复经过多次,但不重复计数. 输入 第一行包含2个正整数V,N,其中V表示格点总数,N表示移动步数. 接下

UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)

先从中找出性能最好的那个数, 在用钱比较少的去组合,能组出来就表明答案在mid的右边,反之在左边, #include<string.h> #include<map> #include<stdio.h> #include<iostream> #include<algorithm> using namespace std; map<string,int> vic;//以字符映射数字 int end,start; int num; int

uva :185 - Roman Numerals(dfs)

题目:uva :185 - Roman Numerals 题目大意:给出一个字符串的等式,问这个字符串是否是罗马等式吗?有符合的阿拉伯等式吗?前者是就输出correct or incorrect ,后者就得分情况: ambiguous 能组成阿拉伯等式的字母组合大于等于2, valid 能组成阿拉伯等式的字母组合只有1种 impossible 没有符合阿拉伯等式的字母组合. 解题思路: 1.能不能组成罗马等式的规则:每个当前的字母(i)的左边的字母((i-1)所对应的值如果比i所对应的值小的话,