已知n个正数:wi, 1<=i<=n, 和M。要求找出{wi }的所有子集使得子集内元素之和等于M。例如: n=4, (w1,w2,w3,w4)=(11,13,24,7),

Posted 随心佩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已知n个正数:wi, 1<=i<=n, 和M。要求找出{wi }的所有子集使得子集内元素之和等于M。例如: n=4, (w1,w2,w3,w4)=(11,13,24,7),相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
int M,n,i;
int x[100];
int w[100];
void SumOfSub(int s, int k, int r)//s:当前和数  k:当前个数  r:总数和
    {
        x[k]=1;
        if(s+w[k]==M) //子集找到
        {
            printf("子集为:");
            for(i=1; i<=k; i++)
                if(x[i]==1) 
                    printf("%d ",w[i]);
            printf("\n");
        }else if(s+w[k]+w[k+1]<=M)
            SumOfSub(s+w[k], k+1, r-w[k]);
        
        if(s+r-w[k]>=M && s+w[k+1]<=M)
        {
            x[k]=0;
            SumOfSub(s, k+1, r-w[k]);
        }
    } 
    void main()
    {
        int r=0;
        int k=1;
        int s=0;
        printf("请输入n和子集内元素和M:");
        scanf("%d%d",&n,&M);
        printf("请输入各元素值:");
        for(i=1;i<=n;i++){
            scanf("%d",&w[i]);
            r+=w[i];
        }
        M=31;
        SumOfSub(s, k, r);
    }

 

以上是关于已知n个正数:wi, 1<=i<=n, 和M。要求找出{wi }的所有子集使得子集内元素之和等于M。例如: n=4, (w1,w2,w3,w4)=(11,13,24,7),的主要内容,如果未能解决你的问题,请参考以下文章

cj 练习

贪心算法之背包问题

20180610模拟赛T4——木棍

有两艘船需要装运的n箱货物,第一艘船的载重量是c1,第二艘船的载重量是c2,wi是货箱i的重量,且w1+w2+……+wn<=c1+c2

poj 3680 Intervals

已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。