题解 | #购物单#
购物单
http://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
考虑三种情况,取三种情况的最大解。
- 不买配件
- 买A或B一个配件
- 买A和B两个配件
// https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37 // 购物单 #include <math.h> #include <stdio.h> #include <string.h> #include <stdbool.h> #include <stdlib.h>
int main()
{
int MY_INT_MAX = -1;
int money, num;
scanf("%d %d", &money, &num);
int food[num][3];
memset(food, 0, sizeof(food));
for (int i = 0; i < num; i++)
{
scanf("%d %d %d", &food[i][0], &food[i][1], &food[i][2]);
}
int hash[num][3]; memset(hash, 0, sizeof(hash)); for (int i = 0; i < num; i++) { for (int j = 0; j < 3; j++) { hash[i][j] = MY_INT_MAX; } } for (int i = 0; i < num; i++) { if (food[i][2] == 0) // it is main object { hash[i][0] = 1; } else { int id = food[i][2] - 1; if (hash[id][1] == MY_INT_MAX) { hash[id][1] = i; } else { hash[id][2] = i; } } } int dp[money + 1]; memset(dp, 0, sizeof(dp)); for (int i = 0; i < num; i++) { for (int j = money; j >= food[i][0]; j--) { if (hash[i][0] == 1) // it is main object { int subId1 = hash[i][1]; int subId2 = hash[i][2]; int subVal1 = 0; int subImp1 = 0; int subVal2 = 0; int subImp2 = 0; if (subId1 != MY_INT_MAX) { subVal1 = food[subId1][0]; subImp1 = food[subId1][1]; } if (subId2 != MY_INT_MAX) { subVal2 = food[subId2][0]; subImp2 = food[subId2][1]; } int dp0 = 0; int dp1 = 0; int dp2 = 0; int dp3 = 0; // case 1: donot buy attachment dp0 = fmax(dp[j], dp[j - food[i][0]] + food[i][0] * food[i][1]); // case 2: buy one attachment if (j - food[i][0] - subVal1 >= 0) { dp1 = fmax(dp[j], dp[j - food[i][0] - subVal1] + food[i][0] * food[i][1] + subVal1 * subImp1); } // case 2: buy another one attachment if (j - food[i][0] - subVal2 >= 0) { dp2 = fmax(dp[j], dp[j - food[i][0] - subVal2] + food[i][0] * food[i][1] + subVal2 * subImp2); } // case 3" buy both two attachment if (j - food[i][0] - subVal1 - subVal2 >= 0) { dp3 = fmax(dp[j], dp[j - food[i][0] - subVal1 - subVal2] + food[i][0] * food[i][1] + subVal1 * subImp1 + subVal2 * subImp2); } dp[j] = fmax(fmax(dp0, dp1), fmax(dp2, dp3)); } } } printf("%d\n", dp[money]); return 0;
}
```