• UVA812-Trade on Verweggistan(暴力)


    题目链接


    题意:商人要去买pruls这样的东西。然后它的价值是一个序列,买的时候要严格从头到尾取,比方你要买第5个,那么前4个也要一起买下来,求商人能获得的最大的利润。

    思路:最大利润肯定就是每一个序列的最大值的和。对于输出的话,我们记录下每行能取得最大值的位置,然后回溯去计算全部可能值,然后输出前10个最小的值。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    const int INF = 0x3f3f3f3f;
    const int MAXN = 55;
    
    int arr[MAXN][MAXN], sum[MAXN][MAXN];
    int num[MAXN], x[MAXN * MAXN + 5];
    int w, b, ans, n;
    
    vector<int> v[MAXN];
    
    void dfs(int cnt, int s) {
        if (cnt == w) {
            x[s] = 1;   
            return;
        }
        int l = v[cnt].size();
        for (int i = 0; i < l; i++)
            dfs(cnt + 1, s + v[cnt][i]);
    }
    
    void outPut() {
        int c = 10;
        for (int i = 0; i < MAXN * MAXN; i++) {
            if (c == 0) 
                break;
            if (x[i]) { 
                printf(" %d", i); 
                c--;
            }
        } 
        printf("
    ");
    }
    
    int main() {
        int t = 0;
        while (scanf("%d", &w) && w) {
            memset(sum, 0, sizeof(sum));
            memset(num, 0, sizeof(num));
            for (int i = 0; i < w; i++) {
                scanf("%d", &b);
                num[i] = b;
                for (int j = 0; j < b; j++) { 
                    scanf("%d", &arr[i][j]);
                    arr[i][j] = 10 - arr[i][j];
                    sum[i][j] = sum[i][j - 1] + arr[i][j];
                } 
            } 
            
            ans = 0;
            for (int i = 0; i < w; i++) {
                int Max = 0;
                v[i].clear();
                v[i].push_back(0);
                for (int j = 0; j < num[i]; j++) { 
                    if (sum[i][j] > Max) {
                        v[i].clear();
                        v[i].push_back(j + 1);  
                        Max = sum[i][j];
                    }
                    else if (sum[i][j] == Max)
                        v[i].push_back(j + 1);
                }  
                ans += Max; 
            } 
    
            memset(x, 0, sizeof(x));
            dfs(0, 0);
    
            if (t) 
                printf("
    ");
            printf("Workyards %d
    ", ++t);
            printf("Maximum profit is %d.
    ", ans);
            printf("Number of pruls to buy:");
            outPut();
        }
        return 0;
    }


  • 相关阅读:
    那些年坑爹的JS题目
    CSS(十三).高度如何铺满全屏
    JS模式和原型精解
    CSS(十二).transition的应用之CSS中心扩散
    一些值得记录的面试题
    随笔
    原生Ajax实现
    code和pre竟然有区别!!!!
    原生JS轮播-各种效果的极简实现(二)面向对象版本的实现和优化
    原生JS轮播-各种效果的极简实现
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7283909.html
Copyright © 2020-2023  润新知