题意:
先给出有几叠商品,然后每叠商品有几个,从上到下的价格是多少;
每一个商品不管你买了多少钱,卖出去都是10块;
现在有个规定,你只能从上往下买商品,要想买下面的商品,就要把它上面的全买了;
问最大利润是多少;还有要买几个商品.如果买的商品数量不同,但都能达到最大利润,就从小到大输出,超过10个,输出最少的10个;
思路:
首先直接遍历算出每一叠所能达到的最大值,已经达到最大值的商品数有哪些;
然后每个最大值相加就是最大利润;
把每一叠能达到最大值的商品个数dfs()算出所有情况;
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<set> using namespace std; int prul[55][25]; int ways[55][25]; int len[55]; int w,b,sum,Max,cur; priority_queue<int, vector<int>, greater<int> > q; set<int> s; void dfs(int cur,int sum) { if(cur == w) { if(!s.count(sum)) { s.insert(sum); q.push(sum); } return; } for(int i = 1; i <= len[cur]; i++) { dfs(cur + 1, sum + ways[cur][i]); } } int main() { int cas = 0; while(scanf("%d",&w) && w) { while(!q.empty()) q.pop(); s.clear(); sum = 0; memset(len, 0,sizeof(len)); for(int i = 0; i < w; i++) { Max = 0; cur = 0; scanf("%d",&b); len[i] = 1; ways[i][len[i]] = 0; for(int j = 0 ;j < b;j++) { scanf("%d",&prul[i][j]); cur += (10 - prul[i][j]); if(cur > Max) { Max = cur; len[i] = 1; ways[i][len[i]] = j + 1; }else if(cur == Max) { len[i]++; ways[i][len[i]] = j + 1; } } sum += Max; } dfs(0,0); if(cas) printf("\n"); printf("Workyards %d\n",++cas); printf("Maximum profit is %d.\n",sum); printf("Number of pruls to buy:"); for(int i = 0 ; i < 10; i++) { if(q.empty()) break; printf(" %d",q.top()); q.pop(); } printf("\n"); } return 0; }
时间: 2024-11-02 23:36:13