2011-09-30 7 views
5

私は明日競技のために練習するプログラミング問題を解決しようとしています。問題はこのサイトの最初のものですhttp://www.cs.rit.edu/~icpc/questions/2010/Oswego_2010.pdfACMプログラミングの質問

このサイトのよくある質問は、アルゴリズムとデータ構造の概念とデザインパターンについて言及しています。ここに私がこれまでに持っていたものがあります。私はこれを解決する方法を理解していません。

public class Ape 
{ 
    public void computeOutput(int weight, int[] capacities, int[] snackLosses) 
    { 
     //not sure what to do 
    } 

    public static void main(String [] args) throws FileNotFoundException 
    { 
     Ape ape = new Ape(); 
     File file = new File(args[0]); 
     Scanner in = new Scanner(file); 
     int totalWeight = in.nextInt(); 
     int n = in.nextInt(); 
     int[] capacities = new int[n]; 
     int[] snackLosses = new int[n]; 

     for (int i = 0; i < n; i++) 
     { 
      capacities[i] = in.nextInt(); 
      snackLosses[i] = in.nextInt(); 
     } 

     ape.computeOutput(totalWeight, capacities, snackLosses); 
    } 
} 
+1

非常に悪い問題の説明:私はバナナのもたらした家庭量を最適化する単語を発見したdidntの。だから、あなたはそれをそのまま解釈するとき、利用可能なバナナの正確な量を運ぶことができる類人猿の "梱包"が必要です。また、非常に典型的でないACM問題は、数の大きさ(例えば、数十、数千、数百万またはそれ以上のオーダーのN)を示すものではない。 – flolo

答えて

4

これは一見したところ、動的プログラミングの問題のようです。

基本的には、関数f(N、K)= K個の利用可能なバンナと最初のN個のサルを所持している家庭に持ち込まれたバンナの数です。

明らかF

(0、K)= 0及びf(N、0)=

そしてあなたがしなければならないすべてをf(N、K)の値を把握0。

  1. サルは何もしないので、バンナナf(n、k)= f(n-1、k)を取ることはありません。 +強 - 彼はそこ
  2. ないように猿は(強、N-1 k)を - bannanaのF(N、K)= Fをとるスタッフ猿はしてテーブルに私達の使用メモ化を記入

食べますこの論理を決定し、f(N、K)を決定すれば、あなたはあなたの答えを得ます。

+0

あなたの解決策は間違っています。選択された類人猿が運ぶことができるものの合計を超えてはならない、利用可能なバナナの最大数だけが考慮されます*サルが食べるものに関係なく*。 –

+0

@DocBrown、これはパラメータkのためのもので、利用可能なバンナナを追跡します。はい、私はそれを考慮に入れます。 (私は間違っているかもしれませんが、私はそれを考慮に入れました)その制限がなければ、明らかにしなければならないことは、彼が食べるものをより多く運ぶすべての猿を送ることでしょう。 –

+0

今、私はそれを得ました。 –

0

この質問は、それ自体よく知られているDPアルゴリズムである0/1ナップザックに減らすことができます。しかし、価値の代わりにあなたは容量 - 軽食を持っています。

0
#include <iostream> 
using namespace std; 
main(){ 
int totalwight,numberapes; 
//cout<<"Enter The total weight of bananas available to lug home : "; 
cin>>totalwight; 
//cout<<"Enter The number of apes : "; 
cin>>numberapes; 
int *capacity = new int [numberapes]; 
int *tcapacity = new int [numberapes]; 
int *snackloss = new int [numberapes]; 
int *pos = new int [numberapes]; 
int *tpos = new int [numberapes]; 
for (int i=0 ; i<numberapes ; i++){ 
    pos[i]=i+1; 
    tpos[i]=0; 
} 

for (int i=0 ; i<numberapes ; i++){ 
    // cout<<"Enter How many monkey # "<<i+1<<" carrying capacity : "; 
    cin>>capacity[i]; 
    tcapacity[i]=capacity[i]; 
    //cout<<"Enter How many snack loss of monkey # "<<i+1<<" : "; 
    cin>>snackloss[i]; 
} 
int *arr = new int [numberapes]; 
for (int i=0 ; i<numberapes ; i++) 
    arr[i] = capacity[i] - snackloss[i]; 
    int temp; 
for (int i=0 ; i<numberapes ; i++) 
    for (int j=0 ; j<i ; j++) 
     if (arr[i] > arr[j]){ 
      temp = arr[i]; 
      arr[i] = arr[j]; 
      arr[j] = temp; 
      temp = tcapacity[i]; 
      tcapacity[i] = tcapacity[j]; 
      tcapacity[j] = temp; 
      temp = pos[i]; 
      pos[i] = pos[j]; 
      pos[j] = temp; 
     } 
int *tarr = new int [numberapes]; 
int j=0; 
for (int i=0 ; i<numberapes ; i++) 
    tarr[i]=0; 
for (int i=0 ; i<numberapes ; i++){ 
     if (arr[i] <= totalwight && tcapacity[i] <= totalwight){ 
      totalwight -= tcapacity[i]; 
      tpos[j] = pos[i]; 
      j++; 
     } 
} 
for (int i=0 ; i<numberapes ; i++) 
     for (int j=0 ; j<numberapes ; j++) 
      if (tpos[j] > tpos[i] && tpos[i]!=0 && tpos[j]!=0){ 
       temp = tpos[i]; 
       tpos[i] = tpos[j]; 
       tpos[j] = temp; 
      } 
int t1=1,t2=0; 
while (t1<=numberapes){ 
    if (t1 == tpos[t2]){ 
     cout<<"1 "; 
     t2++; 
    } 
    else 
     cout<<"0 "; 
    t1++; 
} 

}

関連する問題