Q. Given an array of positive integers, find all possible sets that sum up to a given value K.
Here is my code..
#include<stdio.h>
#include<conio.h>
#define N 10
#define INF 12345678 //ignore
#define max(a,b) a>b?a:b
int M[1000][100];
int a[N+1]={INF,1,2,3,4,5,6,7,8,9,10};
void print(int i, int j,int *arr, int k)
{
if(i<0)
return;
if(j==0)
{
int idx;
for(idx=0;idx<k;idx++)
printf("%d ",arr[idx]);
printf("\n");
return;
}
if(j>=a[i])
{ if(M[i-1][j-a[i]])
{ arr[k]=a[i];
print(i-1,j-a[i],arr,k+1);
}
}
if(M[i-1][j])
print(i-1,j,arr,k);
}
int main()
{
int i,j,k,K=10;
int arr[1000];
for(i=0;i<=N;i++)
M[i][0]=1;
for(k=1;k<=K;k++)
M[0][k]=0;
for(i=1;i<=N;i++)
for(k=1;k<=K;k++)
M[i][k]=max(M[i-1][k-a[i]],M[i-1][k]);
print(N,K,arr,0);
getch();
return(0);
}
Here is my code..
#include<stdio.h>
#include<conio.h>
#define N 10
#define INF 12345678 //ignore
#define max(a,b) a>b?a:b
int M[1000][100];
int a[N+1]={INF,1,2,3,4,5,6,7,8,9,10};
void print(int i, int j,int *arr, int k)
{
if(i<0)
return;
if(j==0)
{
int idx;
for(idx=0;idx<k;idx++)
printf("%d ",arr[idx]);
printf("\n");
return;
}
if(j>=a[i])
{ if(M[i-1][j-a[i]])
{ arr[k]=a[i];
print(i-1,j-a[i],arr,k+1);
}
}
if(M[i-1][j])
print(i-1,j,arr,k);
}
int main()
{
int i,j,k,K=10;
int arr[1000];
for(i=0;i<=N;i++)
M[i][0]=1;
for(k=1;k<=K;k++)
M[0][k]=0;
for(i=1;i<=N;i++)
for(k=1;k<=K;k++)
M[i][k]=max(M[i-1][k-a[i]],M[i-1][k]);
print(N,K,arr,0);
getch();
return(0);
}
No comments:
Post a Comment