题解 | #最大报销额#

最大报销额

https://www.nowcoder.com/practice/8ec050ca75d343cfb45a305f5a7baa73

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

int main() {
    double Q;
    int N;
    while (cin >> Q >> N) {
        if (N == 0) break;
        vector<int> billPrice(N+1);
        billPrice[0]=0;
        int count = 0; //统计有效的票数
        //筛选有效发票
        for (int i = 0; i < N; i++) {
            int k;
            int price = 0;
            bool flag = true;//是否有效
            string temp;
            cin >> k;
            for (int i = 0; i < k; i++) {
                cin >> temp;
                if (temp[0] == 'A' || temp[0] == 'B' || temp[0] == 'C') {
                    string pds = temp.substr(2);
                    int pd = stod(pds)*100;
                    if (pd > 60000) {
                        flag = false;
                    }
                    price = price + pd;
                } else {
                    flag = false;//不符合种类
                }
            }
            if (price > 100000) flag = false; //超出条件
            if (flag) billPrice[1+count++] = price; //符合要求加入数组,第n个发票对应下标n
        }
        //背包问题
        vector<vector<int>> dp(count + 1, vector<int>(Q*100 + 1, 0));
        for (int i = 1; i <= count; i++) {
            for (double j = 1; j <= Q*100;j++) {
                if (j >= billPrice[i]) {
                    dp[i][j] = max(dp[i - 1][j],
                                   dp[i - 1][j - billPrice[i]] + billPrice[i]);
                } else {
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        printf("%.2f\n",dp[count][Q*100]*1.0/100);
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 评论 收藏
分享
10-05 11:11
海南大学 Java
投票
理想江南137:感觉挺真诚的 感觉可以试一试
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务