624&&背包问题&&方案输出
2013-04-14 23:22
218 查看
CD |
Assumptions:
number of tracks on the CD. does not exceed 20
no track is longer than N minutes
tracks do not repeat
length of each track is expressed as an integer number
N is also integer
Program should find the set of tracks which fills the tape best and print it in the same sequence as the tracks are stored on the CD
Input
Any number of lines. Each one contains value N, (after space) number of tracks and durations of the tracks. For example from first line in sample data: N=5, number of tracks=3, first track lasts for 1 minute, second one 3 minutes, next one 4 minutesOutput
Set of tracks (and durations) which are the correct solutions and string ``sum:" and sum of duration times.Sample Input
5 3 1 3 4 10 4 9 8 4 2 20 4 10 5 7 4 90 8 10 23 1 2 3 4 5 7 45 8 4 10 44 43 12 9 8 2
Sample Output
1 4 sum:5 8 2 sum:10 10 5 4 sum:19 10 23 1 2 3 4 5 7 sum:55 4 10 12 9 8 2 sum:45
Miguel A. Revilla 2000-01-10
#include <iostream> #include <vector> #include <stack> using namespace std; class CD{ private: int value, track; vector<int> minute; int sum[30][1500]; stack<int> path; public: void initialize(int m, int t); void readCase(); void computing(); void outResult(); }; void CD::initialize(int m, int t){ value = m; track = t; minute.clear(); while(!path.empty()){path.pop();} } void CD::readCase(){ int temp; minute.push_back(0); for(int i = 1; i <= track; i++){ cin >> temp; minute.push_back(temp); } } void CD::computing(){ for(int i = 1; i <= track; i++){ for(int j = 0; j <= value; j++){ if(j - minute[i] >= 0){sum[i][j] = max(sum[i - 1][j], sum[i - 1][j - minute[i]] + minute[i]);} else{sum[i][j] = sum[i - 1][j];} } } int i = track, j = value; while(sum[i][j]){ if(sum[i][j] == sum[i - 1][j - minute[i]] + minute[i]){ path.push(minute[i]); j = j - minute[i]; } i--; } } void CD::outResult(){ while(!path.empty()){ cout << path.top() << ' '; path.pop(); } cout << "sum:" << sum[track][value] << endl; } int main(){ CD cd; int m, t; while(cin >> m >> t){ cd.initialize(m, t); cd.readCase(); cd.computing(); cd.outResult(); } return 0; }
相关文章推荐
- 背包问题问法变化之---输出方案
- YOJ 2335-0-1背包问题(输出最优装入方案)
- 动态规划之背包问题及输出背包具体方案
- poj 1787 Charlie's Change(背包问题输出路径)
- SDNU 1179.金明的预算方案【NOIP 2006 提高组】【背包问题】【7月30】
- C++递归问题之三---0-1背包问题:给定两个值value和num,在1到num之间取值使这些数和为value,输出所有组合
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
- UVA 147 Dollars ( 完全背包+求解方案数精度问题)
- CF864E:E. Fire(01背包 & 路径输出)
- 多重部分和问题 多重背包&& Coins POJ - 1742
- 背包问题之两个例题:Inflate & Building
- POJ1014:Dividing<动归,背包问题>
- POJ 2125 --Destroying The Graph【最小割解决 "最小点权覆盖问题" && 输出解(割边集) && 各种不懂】
- 关于PHP 的strtotime("2016.01.26")不输出问题bug查找
- nginx "%*s" 格式化输出日志乱码问题
- 华为MT7 Logcat 不输出&少输出问题
- POJ 1742 && HDU 2844 Coins(多重背包问题)
- 算法篇-6-贪心算法-活动安排&背包问题&多机调度
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
- 多重部分和问题 多重背包&& Coins POJ - 1742