思路:对于每个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; }