题解 | #购物单#

购物单

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;
}

全部评论

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务