17 Haziran 2009 Çarşamba

Olimpiyat sorusu falan

Olimpiyatta çözmeye çalıştığımız bi soru. Bir kümeyi(1..N şeklinde) öyle iki parçaya ayıracaz ki o iki parçanın elemanlarının toplamları eşit olsun. Çözüm güzel oldu, yollayayım dedim. Kimse çözemeyince çözümü anlatan ermana teşekkür etmekteyiz buradan.
#include 
#include 
using namespace std;

int main(){
  int N = 42;
  int top = N*(N+1)/4;
  
  vector< vector > dyn;
  
  for(int i=0;i<=top;i++){
    vector temp;
    dyn.push_back(temp);
    for(int j=0;j<=N;j++) dyn[i].push_back(0);
  }
  dyn[0][0] = 1;
  
  for(int i=1;i<=N;i++){
    for(int j=0;j<=top;j++){
      dyn[j][i] = dyn[j][i-1];
    }
    for(int j=0;j<=top;j++){
      if(i+j<=top)
        dyn[j+i][i] += dyn[j][i-1];
    }
  }
  int res = dyn[top-1][N] / 2;
  cout << res << endl;
  return 0;
}

1 yorum:

  1. Bunun bide sayıları 1 ile hayvan(INF) arasında verdiği sorusu var. knapsack yemiyo onda, onada uğraş istersen ;) (Ayrıca taktir ettim bu kadar okuyanla istikrarlı bir şekilde yazmana) -Osman Aka

    YanıtlaSil