这道题给定一个时间上限,然后一个数字N,后面跟着N首歌的时间长度,要我们
求在规定时间w内每首歌都要完整的播放,最多能播放多少时间。一个比较典型的背包问题,
但是要标记出我们选出的歌曲的编号,然后按顺序输出他们的长度,最后输出求的的最长
播放时间。
#include<stdio.h>
#include<string.h>
#define W 10005
int f[W], a[25];
bool vis[25][W];
int w, N;
int main()
{
int j;
while( scanf( "%d", &w) == 1)
{
scanf( "%d", &N);
memset( vis, false, sizeof vis);
memset( f, 0, sizeof f);
for( int i = 1; i <= N; i ++)
scanf( "%d", &a[i]);
for( int i = N; i >= 1; i --)
{
for( j = w; j >= 0; j --)
if( j >= a[i])
if( f[j] < f[j - a[i] ] + a[i] )
{
f[j] = f[j - a[i]] + a[i];
vis[i][j] = true;
}
}
for( int i = 1, j = f[w]; i <= N, j > 0; i ++)
if( vis[i][j]) {
printf( "%d ", a[i]);
j -= a[i];
}
printf( "sum:%d\n", f[w]);
}
return 0;
}
浙公网安备 33010602011771号