题目很简单...就是多重背包的思想...保证每个空间尽量能凑出并且所需的数字最小...
问题就是!!!这个背包的大小...必须要注意阿~~2000000基本是要严格的...大一点爆空间...小一点错结果...我开始就是犯傻..开空间各种2...后来再看了下题目才过的...
Program:
/*
ID: zzyzzy12
LANG: C++
TASK: stamps
*/
#include<iostream>
#include<istream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
#define oo 2000000000
#define ll long long
using namespace std;
int k,n,x,i,w[2505050],num;
int main()
{
freopen("stamps.in","r",stdin);
freopen("stamps.out","w",stdout);
memset(w,-1,sizeof(w));
w[0]=0; num=0;
scanf("%d%d",&k,&n);
while (n--)
{
scanf("%d",&x);
for (i=0;i<=num;i++)
if (w[i]>=0 && w[i]<=k && (w[i+x]==-1 || w[i]+1<w[i+x]) && i+x<=2000000)
{
w[i+x]=w[i]+1;
if (i+x>num) num=i+x;
}
}
for (i=1;i<=num;i++)
if (w[i]==-1 || w[i]>k) break;
printf("%d\n",i-1);
return 0;
}