1. 程式人生 > >演算法訓練 和為T

演算法訓練 和為T

演算法訓練 和為T  

時間限制:1.0s   記憶體限制:256.0MB

問題描述

  從一個大小為n的整數集中選取一些元素,使得它們的和等於給定的值T。每個元素限選一次,不能一個都不選。

輸入格式

  第一行一個正整數n,表示整數集內元素的個數。  第二行n個整數,用空格隔開。  第三行一個整數T,表示要達到的和。

輸出格式

  輸出有若干行,每行輸出一組解,即所選取的數字,按照輸入中的順序排列。  若有多組解,優先輸出不包含第n個整數的;若都包含或都不包含,優先輸出不包含第n-1個整數的,依次類推。  最後一行輸出總方案數。

樣例輸入

5-7 -3 -2 5 90

樣例輸出

-3 -2 5-7 -2 9

2

資料規模和約定

1<=n<=22T<=maxlongint  集合中任意元素的和都不超過long的範圍

#include <stdio.h>
int a[25];
int vis[25];//記錄是否被訪問過
int cnt=0;
int n,ans;
void fx(int t)//根據題目要求,倒著遍歷
{
    int i;
    if(t<0)
    {
        int sum=0,sumv=0;
        for(i=0; i<n; i++)
        {
            if(vis[i])
                sum+=a[i];
            sumv+=vis[i];
        }
        if(sum==ans&&sumv)
            //如果序列中有節點被訪問過,並且和是題目要求的就輸出
        {
            for(i=0; i<n; i++)
                if(vis[i])
                    printf("%d ",a[i]);
            printf("\n");
            cnt++;
        }
        return;
    }
    for(i=0; i<=1; i++)
    {
        vis[t]=i;
        fx(t-1);
    }
}
int main()
{
    long ans;
    scanf("%d",&n);
    int i;
    for(i=0; i<n; i++)
        scanf("%d",&a[i]);
    scanf("%ld",&ans);
    fx(n-1);
    printf("%d\n",cnt);
    return 0;
}