洛谷-P1964 【mc生存】卖东西

洛谷-P1964 【mc生存】卖东西

原题链接:https://www.luogu.com.cn/problem/P1964


题目背景

服务器好好玩

题目描述

lcy0x1去服务器的系统商店卖东西。

一个人的背包有21格。

一开始他的背包里有m件不同的物品(不能卖)。

他要卖n种物品,每种物品有ai件,价值bi,一格可以放ci个,

名字sti(0<sti的长度<100)

相同的物品可以放同一格(只要没放满)。

问他跑一次最多能卖多少钱。

输入格式

第一行m,n(0<=m<=21,0<=n<=100);

下面n行 ai,bi,ci,sti(0<=ai<=1344,0<=bi<=10000,0<ci<=64);

输出格式

最多卖的钱s(0<=s<=1000000);

输入输出样例

输入 #1

20 3
63 1 64 yinshifen
1 10 1 men
1 1 64 yinshifen

输出 #1

64

说明/提示

多重背包

搜索0分!!!

强大的数据

C++代码

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

struct node{
    int a, b, c;
    string st;
}p[105];

bool cmp(node x, node y) {
    return x.b > y.b;
}

int main() {
    int m, n, ans = 0;
    cin >> m >> n;
    for (int i=0; i<n; ++i)
        cin >> p[i].a >> p[i].b >> p[i].c >> p[i].st;
    m = 21 - m;
    for (int i=0; i<n; ++i)
        for (int j=i+1; j<n; ++j)
            if (p[i].st == p[j].st) {
                if (p[i].a + p[j].a > p[i].c) {
                    p[j].a += p[i].a;
                    p[j].a -= p[i].c;
                    p[i].a = p[i].c;
                } else {
                    p[i].a += p[j].a;
                    p[j].a = 0;
                }
            }
    for (int i=0; i<n; ++i)
        p[i].b *= p[i].a;
    sort(p, p+n, cmp);
    for (int i=0; i<m; ++i)
        ans += p[i].b;
    cout << ans << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/yuzec/p/14498190.html