切換
舊版
前往
大廳
主題

[創作|作業][C++]演算法Week6:3-super thief

極巨龍神塔奇 | 2018-05-16 05:30:58 | 巴幣 4 | 人氣 530

神偷
身為一個神偷,除了高超的偷竊技巧外,一眼辨識物品價值及考慮銷贓的情況的能力也都是必須的。
今天身為神偷的你接到任務,要到一個屋內偷竊,並且有一個總價值的目標,而你必須要快速地選出那些偷竊物是你必須要偷竊的目標。
Input
第一行為測資組數 K。
每組第一行會告訴你需要偷的總價值 T 及屋子內有 N 個物品。第二行會有 N 個數,由大到小告訴你物品價值 M。
T、N、M 皆屬於整數,不大於 300。
Output
依照輸入順序,輸出選擇了哪些價值的物品,如果無法達成目標,需要告知無法達成目標。若有多組合可以滿足要求,則輸出第一種可行的組合即可,格式請見範例。
範例輸入:
5
5 3
4 3 1
10 4
9 8 4 2
90 8
23 10 7 5 4 3 2 1
45 8
44 43 12 10 9 8 4 2
100 10
10 10 10 10 10 10 10 10 10 10
範例輸出:
4 1
8 2
impossible
43 2
10 10 10 10 10 10 10 10 10 10
提示:
邏輯:從最大的開始拿,若沒達到要求則拿下一個,拿了之後如果超過要求的價值則捨棄再看下一個,impossible 的狀況出現在所有物品加起來都達不到要求的時候。


/*----- ----- ----- -----*/
//3-super thief
//Made by 105502555 Teemo Hsu(Synasaivaltos)
//Date: 2018/05/04
/*----- ----- ----- -----*/
#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
   int k;
   cin >> k;
   vector<vector<int> > ans;
   ans.resize(k);

   while(--k>=0)
   {
      int t,n,s=0;
      vector<int> m;

      cin >> t >> n;
      m.resize(n);

      for(int i=0;i<m.size();cin>>m.at(i),i++);

      while(m.size())
      {
         ans.at(ans.size()-k-1).resize(0);
         s=0;
         for(int i=0;i<m.size();i++)
         {
            if(s+m.at(i)<=t)
            {
               s+=m.at(i);
               ans.at(ans.size()-k-1).push_back(m.at(i));
            }
            if(s==t)
               break;
         }
         if(s==t)
            break;
         m.erase(m.begin());
      }
      if(s<t)
         ans.at(ans.size()-k-1).resize(0);
   }

   for(int i=0;i<ans.size();i++)
   {
      if(ans.at(i).size()==0)
         cout << "impossible\n";
      else
      {
         for(int j=0;j<ans.at(i).size();cout<<(j?" ":"")<<ans.at(i).at(j),j++);
         cout << endl;
      }
   }

   return 0;
}
送禮物贊助創作者 !
0
留言

創作回應

更多創作