動的計画法を用いて、仕事開始日と終了日を入力して、どの連勤を選べば出勤日が最大になるかについて書いてみました。
参考にした問題が以下です。
現在、サスケは複数のクライアントから依頼を受け取っており、各依頼にはクライアントが指定した開始日と完了日があります(必要な稼働日数は完了日から開始日を引いたものです)サスケはどの注文を約束するかを知りませんでした。
複数のクライアントによって指定された開始日と完了日、およびサスケの作業の開始日と終了日を知っているので、サスケが最大の収入を得ることができるように、サスケがクライアントの依頼を選択するのを手伝ってください。
たとえば、サスケは7つのクライアントの依頼を受け取り、指定された日付と完了日は{[6、10]、[10,12]、[8,13]、[3,7]、[1,6]、[13 、16]、[5、9]}、サスケが{[1,6]、[6,10]、[10,12]、[13,16]を選択した場合、サスケは1日目から16日目まで動作することが知られています。 ]}これら4人の顧客の手数料であるサスケの収入が最も多く、合計で5 + 4 + 2 + 3=14日間の収入があります。マリオが3日目から12日目まで働く場合は、{[3,7]、[10,12]}または{[5、9]、[10、12]}または{[6、10]、[10、12 ]}手数料、マリオが最も収入があり、合計4 + 2=6日間の収入です。
C
1コード 2#include <stdio.h> 3 4int max(int a, int b) 5{ return (a > b) ? a : b; } 6 7int knapSack(int W, int *wt, int *val, int n) 8{ 9 if (n == 0 || W == 0) 10 return 0; 11 12 if (wt[n - 1] > W) 13 return knapSack(W, wt, val, n - 1); 14 15 else 16 return max( 17 val[n - 1] 18 + knapSack(W - wt[n - 1], 19 wt, val, n - 1), 20 knapSack(W, wt, val, n - 1)); 21} 22 23int main() 24{ int item; 25 scanf("%d",&item); 26 int val[item],wt[item]; 27 for(int i=0;i<item;++i) 28 scanf("%d%d",&val[i],&wt[i]); 29 30 int start,end; 31 scanf("%d%d",&start,&end); 32 33 printf("%d\n",knapSack(end, wt, val, item)); 34 return 0; 35}
このように書いてみたのですが、7つのクライアントの依頼日を入力した時には13 と出力されます。
何回も繰り返しコードを見直し書き直したのですが、どうしても最大の14日間にはならないので質問させていただきました。
回答2件
あなたの回答
tips
プレビュー