题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
//https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&rp=1&ru=%2Fexam%2Foj%2Fta&qru=%2Fexam%2Foj%2Fta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26pageSize%3D50%26search%3D50%26tpId%3D37%26type%3D37&difficulty=&judgeStatus=&tags=&title=%E8%B4%AD%E7%89%A9&gioEnter=menu
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int m = 0;
int n = 0;
while (cin >> m >> n) {
m/=10; //价钱/10看作背包容量
vector<vector<int>> price(n+1, vector<int> (3, 0));
vector<vector<int>> value(n+1, vector<int> (3, 0));
vector<vector<int>> ans(n+1, vector<int> (m+1, 0));
for(int i = 1;i<=n;i++){
int v = 0;
int p = 0;
int q = 0;
cin >> v >> p >> q;
v/=10;
if(q==0){
price[i][0] = v;
value[i][0] = p;
}else if(price[q][1]!=0){
price[q][2] = v;
value[q][2] = p;
}else{
price[q][1] = v;
value[q][1] = p;
}
}
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++){ //复制for循环时一定注意检查变量
int a = price[i][0], b = value[i][0];
int c = price[i][1], d = value[i][1];
int e = price[i][2], f = value[i][2];
ans[i][j] = j>=a? max(ans[i-1][j], ans[i-1][j-a]+a*b):ans[i-1][j];
ans[i][j] = j>=a+c? max(ans[i][j], ans[i-1][j-a-c]+a*b+c*d):ans[i][j]; //要不要1附件
ans[i][j] = j>=a+e? max(ans[i][j], ans[i-1][j-a-e]+a*b+e*f):ans[i][j]; //要不要2附件
ans[i][j] = j>=a+c+e? max(ans[i][j], ans[i-1][j-a-c-e]+a*b+c*d+e*f):ans[i][j]; //要不要1附件+2附件,没项都是在前一项的基础上进行对比,所以不要的情况为ans[i][j]
}
cout << ans[n][m]*10 << endl;
}
}

巨人网络公司福利 91人发布
查看27道真题和解析