题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
看完视频讲解后的一些思路
视频里思路非常清晰,但是代码有问题,于是着手研究改了一下。
主要问题出在dp数字打表(遍历)的for循环上。i代表预算,j代表能拿物品个数。
i从1,也就是10块钱预算开始打表。
关于递推公式有个小问题求解决。本来我写的是:
dp[i-a][j-1]+a*b
dp[i-a-c][j-2]+a*b+c*d//本来想着j-2代表要留两个空位放新加进来的a和c
dp[i-a-e][j-2]+a*b+e*f
dp[i-a-e-c][j-3]+a*b+c*d+e*f
像上面这样写递推公式有问题,但是问题不知道在哪。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N,m;
cin>>N>>m;
N/=10;
vector<vector<int>> price(N+1,vector<int>(3,0));//N+1行,3列,每列都是0
vector<vector<int>> value(N+1,vector<int>(3,0));
for(int i = 1; i <= m; i++){
int v,p,q;
cin>>v>>p>>q;
if(q == 0){
price[i][0] = v/10;
value[i][0] = p;
}
else if(price[q][1] != 0){
price[q][2] = v/10;
value[q][2] = p;
}
else{
price[q][1] = v/10;
value[q][1] = p;
}
}
vector<vector<int>> dp(N+1,vector<int>(m+1,0));
for(int i = 1; i <= N; i++){
for(int j = 1; j <= m; j++){
int a = price[j][0];
int b = value[j][0];
int c = price[j][1];
int d = value[j][1];
int e = price[j][2];
int f = value[j][2];
dp[i][j] = i>=a? max(dp[i-a][j-1]+a*b, dp[i][j-1]):dp[i][j-1];
dp[i][j] = i>=a+c? max(dp[i-a-c][j-1]+a*b+c*d,dp[i][j]):dp[i][j];
dp[i][j] = i>=a+e? max(dp[i-a-e][j-1]+a*b+e*f,dp[i][j]):dp[i][j];
dp[i][j] = i>=a+c+e? max(dp[i-a-e-c][j-1]+a*b+c*d+e*f,dp[i][j]):dp[i][j];
}
}
cout<<dp[N][m]*10<<endl;
}
查看7道真题和解析