Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

จะค้นหาผลรวมเป้าหมายจากอาร์เรย์ที่กำหนดโดยการย้อนรอยโดยใช้ C # ได้อย่างไร


ปัญหาผลรวมเป้าหมายคือปัญหาในการหาเซตย่อยโดยให้ผลรวมขององค์ประกอบเท่ากับจำนวนที่กำหนด วิธีการย้อนรอยสร้างการเปลี่ยนแปลงทั้งหมดในกรณีที่เลวร้ายที่สุด แต่โดยทั่วไปแล้ว ทำได้ดีกว่าวิธีการแบบเรียกซ้ำสำหรับปัญหาผลรวมเซตย่อย

เซตย่อย A ของจำนวนเต็มบวก n จำนวนและให้ผลรวมของค่า หาว่ามีซับเซ็ตของเซตที่ระบุหรือไม่ ผลรวมขององค์ประกอบที่มีเท่ากับค่าของผลรวมที่กำหนด

สมมติว่าเรามีอาร์เรย์ [1,2,3] ผลลัพธ์จะเป็น “1,1,1,1 “, “1,1,2”,”2,2”,”13” จากผลลัพธ์ “31 ” ”211” ”121” ทิ้งได้

ตัวอย่าง

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace ConsoleApplication{
   public class BackTracking{
      public void Combinationsums(int[] array, int target){
         List<int> currentList = new List<int>();
         List<List<int>> results = new List<List<int>>();
         int sum = 0;
         int index = 0;
         CombinationSum(array, target, currentList, results, sum, index);

         foreach (var item in results){
            StringBuilder s = new StringBuilder();
            foreach (var item1 in item){
               s.Append(item1.ToString());
            }
            Console.WriteLine(s);
            s = null;
         }
      }
      private void CombinationSum(int[] array, int target, List<int> currentList, List<List<int>> results, int sum, int index){
         if (sum > target){
            return;
         }
         else if (sum == target){
            if (!results.Contains(currentList)){
               List<int> newList = new List<int>();
               newList.AddRange(currentList);
               results.Add(newList);
               return;
            }
         }
         else{
            for (int i = 0; i < array.Length; i++){
               currentList.Add(array[i]);
               CombinationSum(array, target, currentList, results, sum + array[i], i);
               currentList.Remove(array[i]);
            }
         }
      }
   }
   class Program{
      static void Main(string[] args){
         BackTracking b = new BackTracking();
         int[] arrs = { 1, 2, 3 };
         b.Combinationsums(arrs, 4);
      }
   }
}

ผลลัพธ์

1111
112
13
22