আপনাকে শুরু করার জন্য এখানে একটি ইঙ্গিত দেওয়া আছে। কোনও পূর্ণসংখ্যার পার্টিশনের সেট গণনা করার জন্য স্ট্যান্ডার্ড ডায়নামিক প্রোগ্রামিং অ্যালগরিদম প্রয়োগ করুন এবং এর মধ্যে কোনটি পুনরাবৃত্তভাবে সমস্ত অঙ্কগুলি পরীক্ষা করে, পরিবর্তন করে এবং স্বতন্ত্রতা যাচাই করে অনন্য পরিবর্তন-গ্রহণের অনুমতি দেয় তা পরীক্ষা করার জন্য কিছু যুক্তি যুক্ত করুন ।
আরও কিছু বিশদে বিশদ: ধরুন আপনার কাছে একটি মাল্টিসেট এস । একটি নম্বর দেওয়া আমি সঙ্গে 1 ≤ আমি ≤ এন , আপনি কিভাবে একটি submultiset সনাক্ত করতে পারেন এস যে অঙ্কের আমি ? সেই সাবমলিটসেট অনন্য কিনা আপনি কীভাবে পরীক্ষা করতে পারেন? পরিবর্তন করার জন্য মানক গতিশীল প্রোগ্রামিং কৌশলগুলি মানিয়ে নেওয়ার চেষ্টা করুন । ( এই প্রশ্নটি দেখুন ।)Si1≤i≤nSi
একটি মাল্টিসেট এস দেওয়া , আপনি কীভাবে এটি দ্বিতীয় শর্তটি সন্তুষ্ট কিনা তা পরীক্ষা করে দেখতে পেলেন , অর্থাৎ 1 থেকে n পর্যন্ত প্রতিটি সংখ্যাকে এস এর সাবমলিটসেটের যোগ হিসাবে স্বতন্ত্রভাবে প্রকাশ করা যেতে পারে (অনন্য পরিবর্তন-শর্ত)? যদি আপনি আগেরটি সমাধান করেন তবে এটি বেশ সহজ হওয়া উচিত।SnS
দিন পি ( এন ) multisets আপনার অবস্থার উভয় সন্তুষ্ট তালিকা বোঝান। আপনি যদি পি ( 1 ) , পি ( 2 ) , … , পি ( এন ) জানতেন তবে আপনি কীভাবে এই তথ্য পি ( এন + 1 ) তৈরি করতে ব্যবহার করতে পারেন ? এখানে আপনি সংখ্যার পার্টিশনগুলি গণনার জন্য মানক গতিশীল প্রোগ্রামিং কৌশলগুলি মানিয়ে নিতে চাইতে পারেন।P(n)P(1),P(2),…,P(n)P(n+1)
এখানে একটি পদ্ধতির যা সম্ভবত আরও ভাল হবে's
ধরুন এস একটি মাল্টিসেট যা আপনার উভয় শর্তকে সন্তুষ্ট করে ( n এর জন্য )। আমরা একটি মাল্টিসেট টি পেতে কীভাবে এটি বাড়িয়ে দিতে পারি যার একটির আরও উপাদান থাকে? অন্য কথায়, কীভাবে আমরা সব পথ চিহ্নিত কাছে আরো একটি উপাদান যোগ করতে পারেন এস , একটি নতুন multiset পেতে টি উভয় আপনার অবস্থার সন্তুষ্ট (কিছু জন্য এন ' )?SnTSTn′
উত্তরঃ যদি এক্স উপাদান কিছু একটা সমষ্টি হিসাবে প্রকাশ করা যেতে পারে এস , তারপর সেখানে এটি যোগ কোন বিন্দু এস যে কারণ হবে: টি স্বতন্ত্রতা শর্ত লঙ্ঘন করেছে বলে। সুতরাং, আমরা সব পূর্ণসংখ্যার গনা করতে এক্স যে করতে পারবে না উপাদান কিছু একটা সমষ্টি প্রকাশ করা এস ; প্রত্যেকটি এমন এক জিনিস যা একটি নতুন মাল্টিসেট টি পেতে সম্ভাব্যভাবে এস যুক্ত করা যেতে পারে যা উভয় শর্ত পূরণ করবে (অন্য কোনও এন এর জন্য )।xSSTxSSTn
তদুপরি, এটি অঙ্ক করা সম্ভব যে কোন পূর্ণসংখ্যার এস এর কয়েকটি উপাদানের যোগফল হিসাবে প্রকাশ করা যেতে পারে , এবং যা গতিশীল প্রোগ্রামিং ব্যবহার করে তা করতে পারে না। আপনি একটি দ্বি-মাত্রিক অ্যারে তৈরী একটি [ 1 ... | এস | , 1 ... এন ] Booleans, যেখানে একজন [ আমি , ঞ ] যদি পূর্ণসংখ্যা প্রকাশ করার একটি উপায় সত্য ঞ প্রথম কিছু একটা সমষ্টি হিসাবে আমি উপাদান এস (শুধুমাত্র প্রথম আমি উপাদান এস যোগ্য ব্যবহার করা হবে; যেখানে এসSA[1…|S|,1…n]A[i,j]jiSiSSবাছাই করা হয়েছে, সুতরাং এস = { এস 1 , এস 2 , … , এস কে } এবং এস 1 ≤ এস 2 ≤ ⋯ ≤ এস কে )। দ্রষ্টব্য যে A [ i , j ] A [ 1 … i - 1 , 1 … j - 1 ] এর মান ব্যবহার করে কম্পিউটিং করা যেতে পারে : বিশেষত, এ [ i , j ]S={s1,s2,…,sk}s1≤s2≤⋯≤skA[i,j]A[1…i−1,1…j−1]=A[i−1,j]∨A[i−1,j−si]A[i,j]=A[i−1,j]∨A[i−1,j−si] if j>sij>si, or A[i,j]=A[i−1,j]A[i,j]=A[i−1,j] otherwise. This enables us to identify all numbers that are candidates to be added to SS.
Next, for each candidate extension TT of SS (obtained by adding one element to SS), we want to check whether TT satisfies both conditions. Let nn denote the sum of elements of SS, and n′n′ the sum of elements of TT. We need to check whether every integer in the range n+1,n+2,…,n′n+1,n+2,…,n′ can be expressed as a sum of some of the elements of TT. This too can be solved using dynamic programming, using standard algorithms for change-making. (In fact, if you still have the array AA mentioned above you can easily extend it a little bit to solve this problem: we make it an array A[1…|T|,1…n′]A[1…|T|,1…n′], continue to fill in all of the additional entries, and make sure that A[|T|,n+1],A[|T|,n+2],…,A[|T|,n′]A[|T|,n+1],A[|T|,n+2],…,A[|T|,n′] are all true.) So, now we can enumerate all multisets TT that extend SS by a single element and that satisfy both conditions.
This immediately suggests an algorithm to enumerate all multisets S that satisfy your condition, for all n up to some bound, say n≤20. We'll have an array P[1…20], where P[5] stores all multisets S that sum to 5, and generally, P[n] stores the set of all multisets S that sum to n.
Next, we can fill in P[n] iteratively. Start by setting P[1] to contain just the one multiset {1}. Next, for each n (counting up from 1 to 20), for each S∈P[n], enumerate all possible extensions T of S (using the techniques above), let n′ denote the sum of the elements of T, and insert T into P[n′] if it isn't already present and if n′≤20.
This should be pretty doable. Good luck! Have fun! Working through the details will be a good learning-exercise in dynamic programming.