题解 | #购物单#

购物单

http://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4

注意,该题的描述存在误区,所谓附件对应主件的编号,主件不是从0开始计数的,而是所有物件从0开始计数,
这个描述没有10年脑血栓写不出来。

下面的代码我理解错了,以为主件是从0开始计数的,故只通过了一部分测试:

#include <iostream>
#include <vector>
#include <sstream>
using namespace std;

void print_vector(vector<vector<int> > & input) {
    for(int i = 1; i < 4; ++i) {
        auto item = input[i];
        for(auto num : item) 
            cout << num << ",";
        cout << endl;
    }
}

int main() {
    int money, num;
    cin >> money >> num;
    cin.ignore();
    money /= 10;
    int res(0);
    string s;
    vector<vector<int>> prices(num + 1, vector<int>(3, 0));
    vector<vector<int>> values(num + 1, vector<int>(3, 0));
    int num_obj = 0;
    int _price(0), _value(0), _idx(0);
    for(int i = 0 ;i < num; ++i) {
        getline(cin, s);
        //cout << s << endl;
        stringstream ss(s);
        ss >> _price >> _value >> _idx;
        _price /= 10;
        //cout << _price << "," <<_value << "," << _idx << endl;
        if(_idx == 0) {
            ++num_obj;
            prices[num_obj][0] = _price;
            values[num_obj][0] = _price * _value;
        } else {
            if(prices[_idx][1] != 0) {
                //cout << "init annex 2"<< endl;
                prices[_idx][2] = _price;
                //cout << prices[_idx][2] << endl;
                values[_idx][2] = _price* _value;
                //cout << values[_idx][2] << endl;
            } else {
                //cout << "init annex 1"<< endl;
                prices[_idx][1] = _price;
                //cout << prices[_idx][1] << endl;
                values[_idx][1] = _price * _value;
                //cout << values[_idx][1] << endl;
            }
        }
    }

    //print_vector(prices);
    //print_vector(values);
    vector<vector<int>> dp(num_obj + 1, vector<int>(money + 1, 0));
    //cout << "num_obj:" << num_obj << ", money:" << money << endl;
    for(int i = 1; i <= num_obj; ++i) {
        int price_primary = prices[i][0];
        int price_annex_1 = prices[i][1];
        int price_annex_2 = prices[i][2];
        int value_primary = values[i][0];
        int value_annex_1 = values[i][1];
        int value_annex_2 = values[i][2];
        //cout << price_primary << ","<< price_annex_1 << ","<< price_annex_2 << endl;
        for(int j = 1; j <= money; ++j) {
            int tmp_max = dp[i-1][j];
            if(j >= price_primary) 
                tmp_max = max(tmp_max, dp[i-1][j-price_primary] + value_primary);
            if(j >= price_primary + price_annex_1) 
                tmp_max = max(tmp_max, dp[i-1][j-price_primary-price_annex_1] +
                            value_primary + value_annex_1);
            if(j >= price_primary + price_annex_2)
                tmp_max = max(tmp_max, dp[i-1][j-price_primary-price_annex_2] +
                            value_primary + value_annex_2);
            if(j >= price_primary + price_annex_1 + price_annex_2)
                tmp_max = max(tmp_max, dp[i-1][j-price_primary
                                                -price_annex_1
                                                -price_annex_2] +
                            value_primary + value_annex_1 + value_annex_2);
            dp[i][j] = tmp_max;
        } 
    }
    res = dp[num_obj][money] * 10;
    cout << res << endl;
    return 0;
}

修改为下面的代码即可AC:

#include <iostream>
#include <vector>
#include <sstream>
using namespace std;

void print_vector(vector<vector<int> > & input) {
    for(int i = 1; i < 4; ++i) {
        auto item = input[i];
        for(auto num : item) 
            cout << num << ",";
        cout << endl;
    }
}

int main() {
    int money, num;
    cin >> money >> num;
    cin.ignore();
    money /= 10;
    int res(0);
    string s;
    vector<vector<int>> prices(num + 1, vector<int>(3, 0));
    vector<vector<int>> values(num + 1, vector<int>(3, 0));
    int num_obj = 0;
    int _price(0), _value(0), _idx(0);
    for(int i = 1 ;i < num + 1; ++i) {
        getline(cin, s);
        //cout << s << endl;
        stringstream ss(s);
        ss >> _price >> _value >> _idx;
        _price /= 10;
        //cout << _price << "," <<_value << "," << _idx << endl;
        if(_idx == 0) {
            ++num_obj;
            prices[i][0] = _price;
            values[i][0] = _price * _value;
        } else {
            if(prices[_idx][1] != 0) {
                //cout << "init annex 2"<< endl;
                prices[_idx][2] = _price;
                //cout << prices[_idx][2] << endl;
                values[_idx][2] = _price* _value;
                //cout << values[_idx][2] << endl;
            } else {
                //cout << "init annex 1"<< endl;
                prices[_idx][1] = _price;
                //cout << prices[_idx][1] << endl;
                values[_idx][1] = _price * _value;
                //cout << values[_idx][1] << endl;
            }
        }
    }

    //print_vector(prices);
    //print_vector(values);
    vector<vector<int>> dp(num + 1, vector<int>(money + 1, 0));
    //cout << "num_obj:" << num_obj << ", money:" << money << endl;
    for(int i = 1; i <= num; ++i) {
        int price_primary = prices[i][0];
        int price_annex_1 = prices[i][1];
        int price_annex_2 = prices[i][2];
        int value_primary = values[i][0];
        int value_annex_1 = values[i][1];
        int value_annex_2 = values[i][2];
        //cout << price_primary << ","<< price_annex_1 << ","<< price_annex_2 << endl;
        for(int j = 1; j <= money; ++j) {
            int tmp_max = dp[i-1][j];
            if(j >= price_primary) 
                tmp_max = max(tmp_max, dp[i-1][j-price_primary] + value_primary);
            if(j >= price_primary + price_annex_1) 
                tmp_max = max(tmp_max, dp[i-1][j-price_primary-price_annex_1] +
                            value_primary + value_annex_1);
            if(j >= price_primary + price_annex_2)
                tmp_max = max(tmp_max, dp[i-1][j-price_primary-price_annex_2] +
                            value_primary + value_annex_2);
            if(j >= price_primary + price_annex_1 + price_annex_2)
                tmp_max = max(tmp_max, dp[i-1][j-price_primary
                                                -price_annex_1
                                                -price_annex_2] +
                            value_primary + value_annex_1 + value_annex_2);
            dp[i][j] = tmp_max;
        } 
    }
    res = dp[num][money] * 10;
    cout << res << endl;
    return 0;
}
全部评论

相关推荐

KPLACE:首先是板面看起来不够,有很多奖,比我厉害。项目要精减,大概详细描述两到三个,要把技术栈写清楚,分点,什么算法,什么外设,怎么优化,不要写一大堆,分点,你写上去的目的,一是让别人知道你做了这个知识点,然后在面试官技术面的时侯,他知道你会这个,那么就会跟你深挖这个,然后就是个人评价改为专业技能
点赞 评论 收藏
分享
2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务