2017-09-26 142 views
-3

給定一個整數N表示線段的長度。您需要以線段每次切割長度爲x,y或z的整數的方式剪切線段。並且在執行所有切割操作之後,切割段的總數量必須是最大的。分割錯誤

#include <iostream> 
#include<vector> 
#include<math.h> 
#include<climits> 
#include<algorithm> 
using namespace std; 

int count(int*dp,int x,int y,int z,int N) 
{ 
    if(N==0) 
    { 
     return 1; 
    } 
    if(N<0) 
    { 
     return 0; 
    } 
    if(dp[N]!=INT_MAX) 
    { 
     return dp[N]; 
    } 
     dp[N]=max(count(dp,x,y,z,x)+count(dp,x,y,z,N-x) 
       ,max(count(dp,x,y,z,y)+count(dp,x,y,z,N-y), 
       count(dp,x,y,z,z)+count(dp,x,y,z,N-z))); 
    return dp[N]; 
} 
int main() 
{ 
    //code 
    int t; 
    cin>>t; 
    for(int i=0;i<t;i++) 
    { 
     int n; 
     cin>>n; 
     int x,y,z; 
     cin>>x; 
     cin>>y; 
     cin>>z; 
     //cout<<x<<y<<z<<n; 
     int*dp=(int*)malloc(sizeof(int)*n+1); 
     // int dp[n+1]; 
     dp[0]=1; 
     for(int i=1;i<=n;i++) 
     { 
      dp[i]=INT_MAX; 
     } 
     cout<<x<<y<<z<<n; 
     cout<<count(dp,x,y,z,n)<<endl; 
    } 
    return 0; 
} 
+4

[調試你的程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。不要傾倒在我們身上。 – StoryTeller

+4

首先,不要在C++中使用'malloc',而應使用'new []'。然後學會在這種情況下根本不使用動態分配,而是使用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。最後,雖然您可能會分配足夠的空間來使用基於1的數組(或向量)索引,但請避免這種情況,並且可能會讓所有讀取代碼的人感到困惑。 –

+0

至於你的問題,你有沒有檢查你的遞歸​​不深?您是否因*全部*輸入而崩潰?還是隻爲一些輸入? –

回答

1

約用C MEMOR分配++

C++是不是C. malloc()應該真正在C++中是可以避免的,因爲它沒有考慮對象生命週期的保養,因此重要提示需要一個placement new時它用於不是trivially copiable的類型。

當需要時,C++內存分配應使用new(或make_uniquemake_shared結合智能指針)。

但最好是避免使用內存分配,而是依靠更安全和更強大的containers,例如vectors

您的問題

這就是說,int是平凡可複製,所有你需要做它的工作是大小公式修正爲sizeof(int)*(n+1)。這是因爲你的循環直到包含n,所以你的陣列必須保存n+1元素。

+0

@ user0042好吧,我希望保持簡單,以促進從C到C++的OP轉換。但你是對的,我已經編輯了相應的答案 – Christophe

+0

我沒有DV你的答案順便說一句。 – user0042

+0

@ user0042完全沒問題!即使你願意,DV和一些建設性的批評意見總是有助於提高貢獻的質量。謝謝。 – Christophe