UVA624 CD,01背包+打印路径,好题!

时间:2023-03-09 20:57:04
UVA624 CD,01背包+打印路径,好题!

624 - CD

题意:一段n分钟的路程,磁带里有m首歌,每首歌有一个时间,求最多能听多少分钟的歌,并求出是拿几首歌。

思路:如果是求时常,直接用01背包即可,但设计到打印路径这里就用一个二维数组标记一下即可。

const int N=1e3+10;
int n,m,a[N],d[N],v[N][N];
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(v,0,sizeof(v));
memset(d,0,sizeof(d));
for(int i=0; i<m; i++)
{
scanf("%d",&a[i]);
for(int j=n; j>=a[i]; j--)
if(d[j]<=d[j-a[i]]+a[i])
{
d[j]=d[j-a[i]]+a[i];
v[i][j]=1;
}
}
for(int i=m,j=n; i>=0; i--)//注意要倒过来输出;
if(v[i][j])
{
printf("%d ",a[i]);
j-=a[i];
}
printf("sum:%d\n",d[n]);
}
return 0;
}