812 - Trade on Verweggistan (暴力枚举)(二)

2014-11-24 07:22:03 · 作者: · 浏览: 2
rdyard。每个给定b个pruls。这是一个栈从顶到底。现在每个wordyard都可以取一些出来。,每个利润是10 - 每个pruls的价值。求最大利润,和组成个数,注意如果组成个数情况不同,输出前10个最小的。

思路:对于每个wordyard枚举最大利润,并把个数保存下来,然后把所有种数加起来保存到一个set里面

代码:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; #define max(a,b) (a)>(b) (a):(b) #define min(a,b) (a)<(b) (a):(b) const int N = 55; const int M = 25; int n, num[N][M], res[N][M], resn[N]; set
       
         ans; void init() { ans.clear(); memset(resn, 0, sizeof(resn)); for (int i = 0; i < n; i++) { scanf("%d", &num[i][0]); for (int j = 1; j <= num[i][0]; j++) scanf("%d", &num[i][j]); } } void cal(int i, int sum) { if (i == n) { ans.insert(sum); return; } for (int j = 0; j < resn[i]; j++) cal(i + 1, sum + res[i][j]); } void solve() { int Max = 0; for (int i = 0; i < n; i++) { int sum = 0, Maxx = 0; resn[i] = 1; res[i][0] = 0; for (int j = 1; j <= num[i][0]; j++) { sum += 10 - num[i][j]; if (sum > Maxx) { Maxx = sum; resn[i] = 1; res[i][0] = j; } else if (sum == Maxx) res[i][resn[i]++] = j; } Max += Maxx; } printf("Maximum profit is %d.\n", Max); printf("Number of pruls to buy:"); cal(0, 0); int count = 0; for (set
        
         ::iterator it = ans.begin(); it != ans.end() && count != 10; it++, count++) cout <<" "<< *it; printf("\n"); } int main() { int cas = 0; while (~scanf("%d", &n) && n) { if (cas) printf("\n"); init(); printf("Workyards %d\n", ++cas); solve(); } return 0; }