p.s.自用
p.ss.吐槽一句,没想到一年后竟然还会更新这个合集:)
题目描述
设有已知面额的邮票m种,每种有n张,用总数不超过n张的邮票,能从面额1开始,最多连续组成多少面额。(1≤m≤100,1≤n≤100,1≤邮票面额≤255)
输入
第一行:m,n的值,中间用一空格隔开。
第二行:A[1..m](面额),每个数中间用一空格隔开。
输出
连续面额数的最大值
样例输入 Copy
3 4 1 2 4
样例输出 Copy
14
参考答案
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> sum(25600, 0); // 面额计数
bool cmp(int a, int b)
{
return a < b;
}
int main()
{
// 输入
int m, n;
cin >> m >> n;
vector<int> stamp(m + 1, 0);
for (int i = 1; i <= m; i++)
cin >> stamp[i];
// 排序
sort(stamp.begin(), stamp.end(), cmp);
// 计算
if (stamp[1] != 1)
cout << 0 << endl;
else
{
sum[1] = 1;
for (int i = 2;; i++)
{
for (int j = 1; j <= m && stamp[j] <= i; j++)
{
if (sum[i] == 0 || sum[i] > sum[i - stamp[j]] + 1)
sum[i] = sum[i - stamp[j]] + 1;
}
if (sum[i] > n)
{
cout << i - 1 << endl;
break;
}
}
}
return 0;
}