题目大意:
你被提供一套不同面额的邮票,如{1,3,5},并规定最多能在一封信上粘贴的邮票数(如5张),你的目标是算出最大的可连续贴出的面值集合的元素个数。对{1,3,5}最多贴五张而言,下列面值是可达到的。
1: 1 6: 1+5 11: 5+5+1 16: 5+5+3+3 21: 5+5+5+3+3
2: 1+1 7: 5+1+1 12: 5+5+1+1 17: 5+5+5+1+1 22: ????
3: 3 8: 5+3 13: 5+5+3 18: 5+5+5+3
4: 1+3 9: 5+3+1 14: 5+5+3+1 19: 5+5+5+3+1
5: 5 10: 5+5 15: 5+5+5 20: 5+5+5+5
这里显示面值22无法用五张以内的邮票贴出,因此能贴出的最大的连续集是[1…21],但是没有理由相信这个连续集非得从1开始。
解题思路:
一遍dp,很简单,代码就不附解析了~
#include <cstdio>
#include <cstring>
#define r(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int ans,s,e,l,b[21],maxn,ansum,xx,f[10001],m;
int min(int x,int y)
{
return x>y?y:x;
}
int main()
{
//freopen("stamp.in","r",stdin);
//freopen("stamp.out","w",stdout);
scanf("%d%d",&s,&e);
memset(f,0x7f,sizeof(f));
f[0]=0;
r(i,1,s) scanf("%d",&b[i]),m=b[i]>m?b[i]:m;
m*=e;
r(i,1,s)
r(j,0,m)
f[j+b[i]]=min(f[j]+1,f[j+b[i]]);
maxn=0;
r(i,1,m)
{
if (f[i]!=0x7f&&f[i]<=e) ans++;
else ans=0;
maxn=ans>maxn?ans:maxn;
}
printf("%d",maxn);
return 0;
}