一開始把題意理解錯了,以為刻在同一張光盤上的歌曲的時間順序不變就可以了。
事實上不僅同光盤上的歌曲寫入時間要按順序,前一張光盤上的歌曲不能比后一張歌曲寫入時間要晚。
數據量比較少,用回溯法,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;
}