一开始把题意理解错了,以为刻在同一张光盘上的歌曲的时间顺序不变就可以了。
事实上不仅同光盘上的歌曲写入时间要按顺序,前一张光盘上的歌曲不能比后一张歌曲写入时间要晚。
数据量比较少,用回溯法,dp也行。
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("rockers.in");
ofstream fout("rockers.out");
#ifdef _DEBUG
#define out cout
#define in cin
#else
#define out fout
#define in fin
#endif
int capacity[20];;
int songs[20];
int song_num,disk_num;
int res = 0;
int cur;
void backtracing(int depth,int last)
{
if(depth==song_num){
if(cur>res){
res = cur;
}
return;
}
//如果后面所有的歌曲都加上还比最优值小,剪枝
if(cur+song_num-depth<=res)
return;
for(int i=last;i<disk_num;++i){
//如果当前歌曲需要刻录,那只需刻在第一张能装得下的光盘上。
if( capacity[i]>=songs[depth]){
cur++;
capacity[i]-=songs[depth];
backtracing(depth+1,i);
capacity[i]+=songs[depth];
cur--;
break;
}
}
// 不刻当前歌曲
backtracing(depth+1,last);
}
void solve()
{
int c;
in>>song_num>>c>>disk_num;
for(int i=0;i<song_num;++i)
in>>songs[i];
for(int i=0;i<disk_num;++i)
capacity[i] = c;
backtracing(0,0);
out<<res<<endl;
}
int main(int argc,char *argv[])
{
solve();
return 0;
}