我用的是先合并相同物品,再计算价值排序的方法,跟题解里的一个很像,但是第五点wa了。本来想看之前的帖子来debug的,结果发现打不开,只能相信后人的智慧了
#include<bits/stdc++.h>
using namespace std;
int cmp(int a, int b)//定义降序排序规则
{
return a > b;
}
int main()
{
int bag = 21;
int n, m, a[110], b[110], c[110], v[110] = {}, sum = 0;
string str[110];
cin >> m>> n;
if (n == 0 || m == 21)//可预测的条件判断
{
cout << 0;
return 0;
}
for (int i = 1; i <= n; i++)//输入
{
cin >> a[i] >> b[i] >> c[i] >> str[i];
}
bag = bag - m;//背包剩余容量
for (int i = 1; i < n; i++)
{
for (int j = i+1; j <= n; j++)
{
if (a[i] == c[i])//若背包满
break;
if (str[i] == str[j])//若id相同
{
if (a[i] + a[j] <= c[i])//若加起来不满
{
a[i] += a[j];
a[j] = 0;
}
else {//若满
a[i] = c[i];
a[j] -= c[i] - a[i];
}
}
}
}
for (int i = 1; i <= n; i++)//计算价值
{
v[i] = a[i] * b[i];
}
sort(v , v + 110,cmp);//价值降序排
for (int i = 0; i < bag; i++)
sum += v[i];
cout << sum;
return 0;
}