题目意思:
设有已知面额的邮票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<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[105],s[30000];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
if(a[1]!=1)
cout<<"0"<<endl;
else
{//肯定有1面额-->凑一只用一张,s[1]=1
s[1]=1;//所凑面额最小张数超出范围说明这时候能凑得数是最大的
for(int i=2;;i++)//找面额,s[]为所凑面额最小张数
{//每种不能超出n张,j<=n
for(int j=1;j<=n && a[j]<=i;j++)//选取面额要小于要凑的数
{//用a[j]这一张,
if(s[i]==0 || s[i]>s[i-a[j]]+1)//s[i]还没赋值或所用数大于 大于
s[i]=s[i-a[j]]+1;
}
if(s[i]>m)
{
cout<<i-1<<endl;
break;
}
}
}
return 0;
}