![](/img/trans.png)
[英]How to find all subsets whose sum adds up to the value of a target value using dynamic programming in C
[英]How to find all subsets in Subset Sum (with Dynamic Programming) in C
我是C的新成員(學習了1.5個月),我們的大學教授要求我們找到Subset Sum問題的動態規划解決方案(以及其他2個問題),但我已按照他的指示行事,而且我堅持如何實際查找(打印)請求的子集。 有人可以幫我理解這是如何工作的以及如何找到所有子集?
對於下面的代碼,表格為{3,2,1,2,4,3,4,1},子集需要總計為7。
編輯! - >我修改了初始代碼,以便找到總共特定值的子集數量(在我們的例子中為7,子集為20)。 我再說一遍,我需要幫助找到總和值的所有子集(組合)(在這種情況下為7)。
在上面的例子中,這意味着代碼將能夠打印20個子集,這些子集是:
子集1:3 2 1 1
子集2:3 2 2
子集3:3 1 2 1
子集4:3 1 3
子集5:3 4
子集6:3 3 1
子集7:3 4
子集8:2 1 4
子集9:2 1 3 1
子集10:2 1 4
子集11:2 2 3
子集12:2 4 1
子集13:2 4 1
子集14:1 2 4
子集15:1 2 3 1
子集16:1 2 4
子集17:2 4 1
子集18:2 4 1
子集19:4 3
子集20:3 4
在隨后的C代碼中,我能夠打印指令要求我的表,並且通過該表我必須找到所有子集。 該表的說明如下:
x[i][j]=x[i-1][j]; if(j>=y[i-1]) x[i][j]+=x[i-1][jy[i-1]];
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
long set[] = {3,2,1,2,4,3,4,1};
long sum =7;
long n = sizeof(set)/sizeof(set[0]);
iter_subset_sum(set, n, sum);
return 0;
}
int iter_subset_sum (int *y, long n, long sum) {
int i,j,k,**x;
x=malloc((n+1)*sizeof(long**));
for(i=0;i<=n;i++)
x[i]=malloc((sum+1)*sizeof(long*));
for (i=0; i<=n; i++)
x[i][0] = 1;
for (i=1; i<=sum; i++)
x[0][i] =0;
for (i=1; i<=n; i++) {
for (j=1; j<=sum; j++){
x[i][j]=x[i-1][j];
if(j>=y[i-1])
x[i][j]+=x[i-1][j-y[i-1]]; } }
for (i = 0; i <= n; i++){
for (j = 0; j <= sum; j++)
printf ("%4d", x[i][j]);
printf("\n");
}
printf("There are %d subsets :", x[n][sum]);
}
非常感謝你提前!! 如果你能幫助像我一樣想要慢慢“深入”進入C的新手,我將非常感激...
#include <stdio.h>
int iscan(int a[],int n,int sum){
int f[sum+1],m=0,i,j,k,el,o=0;
for(i=1;i<=sum;i++)f[i]=0;f[0]=1;
for(i=0;i<n;i++){
el=a[i];
if(el>sum)continue;
m=m+el>sum?sum:m+el;
for(k=m-el,j=m;k>=0;j--,k--){
if(f[k]){
/* f[j]=el;*/ //old only last conest
push_toarray_of_stack(on j position ,item size of el);;//this pseudocode is hint for u homework*********** so and change printing all combination after builing array_of_stack's of conection
}
}
if(!f[sum])continue;
k=sum;
while(k){
printf("%d ",f[k]);
k-=f[k];
}
printf("%s\n","");
//exit(0);
o++;
}
//printf("%s\n","can't");
return o;
}
int main(){
int set[] = {1, 3, 2, 4, 2, 6, 5};
int sum = 5;
return iscan(set,sizeof(set)/sizeof(set[0]),sum);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.