close
思路: 本來想要dp 然後紀錄,然而,這題用暴力法就搞定, 遞迴一直做,全部都找找看貨櫃數量是否等於y,如果等於y再看是否等於最大載重,兩者都是就輸出答案。
這題測資真的水,用剛剛好最大載重,不用不超過的判斷就能過。.....
代碼:
- #include <cstring>
- #include <stack>
- #include <iostream>
- using namespace std;
- int w, y, n;
- int arr[105], ans[105][2];
- bool ok;
- void dfs(int i, int sum, int d){
- if(ok)
- return;
- for(; i < n; ++i){
- ans[d][0] = i;
- sum += arr[i];
- if(d != y - 1)
- dfs(i + 1, sum, d + 1);
- else{
- if(sum == w){
- cout << "k" << ans[0][0];
- for(int k = 1; k < y; ++k)
- cout << ",k" << ans[k][0];
- cout << endl;
- ok = true;
- return;
- }
- else if(sum < w){
- if(ans[y][1] < sum){
- ans[y][1] = sum;
- for(int k = 0; k < y; ++k)
- ans[k][1] = ans[k][0];
- }
- }
- }
- sum -= arr[i];
- }
- }
- int main()
- {
- while(cin >> w){
- cin.ignore();
- cin >> y;
- cin.ignore();
- cin >> n;
- memset(ans, 0, sizeof(ans));
- for(int i = 0; i < n; ++i){
- cin.ignore();
- cin >> arr[i];
- }
- ok = false;
- dfs(0, 0, 0);
- if(ok);
- else{
- cout << "k" << ans[1][0];
- for(int k = 1; k < y; ++k)
- cout << ",k" << ans[1][k];
- cout << endl;
- }
- }
- return 0;
- }
文章標籤
全站熱搜