代码写的很丑别介意
#include<bits/stdc++.h>
using namespace std;
const int N = 1e8;
int n, m, a[105], b[105], c[105], sum;
string sti[105];
int w[1005], shu[1005], t[1005], dp[N];
set<string> str;//其实能不用
map<string, int> fin;
//一堆定义
int main(){
cin >> m >> n;
for(int i = 1; i <= n; i++){
cin >> a[i] >> b[i] >> c[i] >> sti[i];
if(str.find(sti[i]) == str.end()){//合并,就是如果每出现过那么建一个,否则加上
str.insert(sti[i]);
fin[sti[i]] = sum + 1;
w[++sum] = b[i];
shu[sum] = a[i];
t[sum] = c[i];
}
else{
int r = fin[sti[i]];//出现过的序号
shu[r] += a[i];
}
}
int jshu, jr, j = sum;
for(int i = 1; i <= j; i++){//将物品个数为单位改成格子数为单位
jshu = shu[i] / t[i];
jr = shu[i] % t[i];
w[++sum] = w[i] * jr;
shu[sum] = 1;
w[i] = t[i] * w[i];
shu[i] = jshu;
}
int V = 21 - m;
for(int i = 1; i <= sum; i++){//多重背包
for(int v = 0; v <= V; v++){
for(int k = 0; k <= min(shu[i], v); k++){
dp[v] = max(dp[v], dp[v - k] + k * w[i]);
}
}
}
cout << dp[V];
return 0;
}