刚开始懵逼了,后来才看懂题,像BFS的求某一列中序列和问题;
虽然不知道能不能用DFS解,但是很明显的01背包问题,就用01背包解决吧;
题意:
你即将开车出远门,当然希望在车上能聆听一些美好的音乐。你的车上只有播放录音带的设备,但是你最喜欢的音乐却都存放在CD上。所以你需要把CD上的音乐转录到录音带上。现在你必须解决的问题是:你的空白录音带长共N分钟,你如何选择CD上的歌使得尽可能的利用录音带的空间。以下是一些此问题的假设:
- CD上的歌最多不会超过20首。
- 没有任何一首歌的长度超过N分钟。
- 要录在录音带上的歌不能重复。
- 每首歌的长度以一整数表达。
- N也是一个整数。
你的程式必须找出该放哪些CD上的歌到录音带上(按CD上的顺序),使得录音带空白的空间最小。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std ;
const int maxn=10001;
bool vis[maxn][30];
int n , m , a[30],dp[maxn];
int main()
{
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
for(int i = 0 ; i < m ;i++)
{
cin>>a[i];
}
for(int i = 0 ; i < m ;i++)
{
for(int j = n ;j>=a[i];j--)
{
if(dp[j]<=dp[j-a[i]]+a[i])
{
dp[j]=dp[j-a[i]]+a[i];
vis[j][i]=1;
}
}
}
for(int i = m-1,j=n;i>=0;i--)
{
if(vis[j][i])
{
printf("%d ",a[i]);
j-=a[i];
}
}
printf("sum:%d\n",dp[n]);
}
return 0 ;
}
记录路径很麻烦,但是想想就好,另外开一个数组判断是否走过。