#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#pragma warning(disable:4996)
using std::cin;
using std::cout;
using std::endl;
using std::stringstream;
using std::string;
using std::vector;
using std::list;
using std::pair;
using std::set;
using std::multiset;
using std::map;
using std::multimap;
using std::stack;
using std::queue;
using std::priority_queue;
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int volume;//磁盘的容量,期望音乐时间和能达到这个数
while (cin >> volume)
{
int n; cin >> n;
int sum=0; //当前歌的时间长度,总时间长度
vector<int>minute;//每首歌的时间长度
while (n--)
{
int length; cin >> length;
minute.push_back(length);
sum += length;
}
vector<vector<vector<int>>>dp(sum + 1);
dp[sum].push_back(minute);
for (size_t i = 0; i != minute.size(); i++)
{
for (int j = sum - minute[i]; j >= 0; j--)
{
for (size_t k = 0; k != dp[j + minute[i]].size(); k++)//和为j+minute[i]的第k种情况
{
if (dp[j + minute[i]][k].size() && dp[j + minute[i]][k][i])
{
dp[j].push_back(dp[j + minute[i]][k]);
dp[j][dp[j].size()-1][i] = 0;
}
}
}
}
for (int i = std::min(volume,sum); 1; i--)
{
if (dp[i].size())
{
for (size_t j = 0; j != dp[i][0].size(); j++)
{
if (dp[i][0][j])
{
cout << dp[i][0][j] << ' ';
}
}
cout << "sum:" << i << endl;
break;
}
}
}
return 0;
}
UVA_624_CD
最新推荐文章于 2018-04-02 21:08:29 发布