根据题目可得,每个蛋糕盒的大小相同,背包恰好能装 n 个蛋糕盒,要求最大蛋糕数量,只需要每个蛋 糕盒中蛋糕尽可能的多,所以我们只需要将所有蛋糕盒中的蛋糕数存入数组,然后从大到小排序,输出前 n 个即可,可以设计一个结构体去存储每个货柜中的蛋糕盒数和 每个蛋糕盒内的蛋糕数,然后按蛋糕盒中的蛋糕数目排序。
1.设计结构体;
struct are {
int a; //蛋糕盒数目
int b; //该盒中蛋糕数目
};
2.进行排序;
采用快排算法使得时间复杂度减小;
快排思想在此链接:http://t.csdn.cn/uQGCP
3.计数累加即可;
#include <iostream>
#include <cassert>
using namespace std;
struct are {
int a;
int b;
};
int Sort(are* p, int left, int right)
{
assert(nullptr != p);
are tem = p[left];
while (left < right)
{
while (p[right].b >= tem.b && left < right) right--;
p[left] = p[right];
while (p[left].b < tem.b && left < right) left++;
p[right] = p[left];
}
p[left] = tem;
return left;
}
void QuickSort(are* p, int left, int right)
{
assert(nullptr != p);
if (left >= right) return;
int mid = Sort(p, left, right);
QuickSort(p, left, mid - 1);
QuickSort(p, mid + 1, right);
}
int main()
{
int m, n;
int sum = 0;
are w[20];
cin >> n >> m;
for (int i = 0; i < m; i++)
{
cin >> w[i].a >> w[i].b;
}
QuickSort(w, 0, m - 1);
for (int i = m - 1; i >= 0;)
{
while (n>0 && w[i].a > 0)
{
sum += w[i].b;
w[i].a -= 1;
n -= 1;
}
i--;
if (n <= 0) break;
}
cout << sum;
}