您的位置:首页 > 其它

USACO 2008 Dec Silver 1.Hay For Sale

2015-08-19 11:42 411 查看
一打眼就是背包嘛。原始程序是这样的。

#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m;
int f[55000];
int main()
{
scanf("%d %d",&n,&m);
f[0]=1;
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
for(int j=n;j>=x;j--)
{
f[j]=max(f[j-x],f[j]);
}
}
for(int i=n;i>=0;i--)
{
if(f[i]!=0)
{
printf("%d",i);
return 0;
}
}
}但会发现超时。。。于是就优化一下喽,将出现过的体积数放在一个数组里。
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m;
int cnt;
int que[5500];
int vis[55000];
int cmp(int a,int b)
{
return a>b;
}
int main()
{
scanf("%d %d",&n,&m);
que[1]=0;
cnt=1;
vis[0]=1;
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
if(x>n)continue;
int t=0;
for(int j=1;j<=cnt;j++)
{
if(vis[que[j]+x]==0&&que[j]+x<=n)
{
t++;
que[cnt+t]=que[j]+x;
vis[que[j]+x]=1;
}
}
cnt+=t;
}
sort(que+1,que+1+cnt,cmp);
printf("%d",que[1]);
}

然后呢?就过了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息