Quay lui tìm các bộ số có k chữ số trong mảng n chữ số bằng tổng m cho trước

chào mọi người, em mới bắt đầu tìm hiểu về thuật toán quay lui gặp khó khăn với bài này mong mọi người giúp đỡ.
cho mảng n phần tử tìm các bộ số có k chữ số chữ số bằng tổng m cho trước.
em gặp vấn đề ở chỗ đã tìm được các bộ số bằng m rồi nhưng lại bị trùng lặp mong mng giúp đỡ chỗ này
đây là file test của em

n = 6 
m = 9 
k = 3
6 2 5 1 9 2 
#include<iostream>
#include<cmath>
#define maxn 100
using namespace std; 

int d=0; 
int n,k,m; 
int x[maxn],a[maxn]; 

void docfile(int a[maxn],int &n,int &m,int &k)
{
	FILE *f = fopen("test5.5.inp","rt"); 
	fscanf(f,"%d",&n); 
	fscanf(f,"%d",&m); 
	fscanf(f,"%d",&k); 
	for(int j = 1; j <= n; j++)
	fscanf(f,"%d",&a[j]); 
	fclose(f); 
}

void output()
{
	cout<<++d<<" : ";  
	for(int i = 1; i<= k; i++)
		cout<<x[i]<<"  "; 
	cout<<endl;
}



int tong(int x[])
{
	int s =0; 
	for(int j = 1 ;j <= k; j++)
	s = s+x[j]; 
	return s; 
}


void bai5(int i)
{
	for(int j = 1 ; j <= n; j++)
{ 
	  if(a[j] != 0)
	{ int temp = a[j]; 
	  x[i] = a[j]; 
	  a[j] = 0;
	  if ( i == k && tong(x) == m ) output();
	  else bai5(i+1);
	  a[j] = temp;
	}
}
}


int main()
{   
    int j; 
	docfile(a,n,m,k); 
	bai5(1);
	
	return 0; 
 }

Đầu tiên chuyển qua dạng bảng tần suất vì không quan tâm vị trí, sau đó lặp qua tần suất đó.

Nếu chỉ dùng vị trí thì trong trường hợp 3 số bằng nhau sẽ có 3 tổ hợp giống y hệt.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?