UVA 624 CD
题意我不知道,应该是给你一个时间,要在时间内,尽可能的多放歌,输出放歌的总时长,以及要放哪些歌。(应该是这样的,没怎么读题)
分析:典型的01背包问题,只不过加了一个路径,而且没有要求路径怎么输出,所以随便输出路径就行了。多种情况下,也是随便输出。所以增加一个二位数组vis来记录路径,vis[i][j]表示前i种物品在容量为j的背包中是否被选。所以求01背包时顺便就把vis求了即可。具体参见代码进行理解。代码如下
int n,a[25],vis[25][maxn],ans,m,dp[maxn],tot,num;
int main()
{
while(~sss(n,m))
{
num=n;
mm(dp,0);
mm(vis,0);
tot=0;
For(i,1,m)ss(a[i]);
For(i,1,m)
{
For1(j,n,a[i])
if(dp[j]<dp[j-a[i]]+a[i]&&j-a[i]>=0)
{
dp[j]=dp[j-a[i]]+a[i];
vis[i][j]=1;
}
}
For1(i,m,1)
{
if(vis[i][n]&&n>=0)
{
printf("%d ",a[i]);
n-=a[i];
}
}
printf("sum:%d\n",dp[num]);
}
return 0;
}