题目很简单...就是多重背包的思想...保证每个空间尽量能凑出并且所需的数字最小...
问题就是!!!这个背包的大小...必须要注意阿~~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;
}
本文介绍了一个基于多重背包思想的问题解决方案,重点在于如何合理分配空间大小,确保既能满足所需数字的最小化,又不会超出内存限制。

被折叠的 条评论
为什么被折叠?



