UVa 574 - Sum It Up

題目:已知n個數字構成的非遞增序列,求能從中取出的和為t 的不同組合。

分析:組合數學。組合數生成,這裡利用dfs求解。

            生成的過程可全排列相同,每次判斷生成的組合是否之前找到過即可;

            這裡只需要保留上次計算的結果,因為新的結果序列上一定小於之前的;

說明:年後的第一題。

#include <stdio.h>
#include <stdlib.h>

int input[13];
int sum_to_end[13];
int ans[13];
int ans_size;
int ans_count;
int save[13];
int dfs(int sum, int now, int s, int n, int deep)
{
	if (now == sum) {
		int is_new = 1;
		if (ans_count) {
			is_new = 0;
			for (int i = 0; i < deep; ++ i) {
				if (ans[i] < save[i]) {
					break;
				}
				if (ans[i] != save[i]) {
					is_new = 1;
					break;
				}
			}
		}
		if (is_new) {
			for (int i = 0; i < deep; ++ i) {
				ans[i] = save[i];
			}
			printf("%d",ans[0]);
			for (int i = 1; i < deep; ++ i) {
				printf("+%d",ans[i]);
			}
			puts("");
			ans_count ++;
			ans_size = deep;
		}
		return 1;
	}
	for (int i = s; i <= n; ++ i) {
		if (sum_to_end[i]+now >= sum && input[i]+now <= sum) {
			save[deep] = input[i];
			dfs(sum, now+input[i], i+1, n, deep+1);
		}
	}
	return 0;
}

int main()
{
	int t, n;
	while (~scanf("%d%d",&t,&n) && t+n) {
		int count = 0;
		for (int i = 1; i <= n; ++ i) {
			scanf("%d",&input[i]);
		}
		sum_to_end[n] = input[n];
		for (int i = n-1; i >= 1; -- i) {
			sum_to_end[i] = sum_to_end[i+1]+input[i];
		}
		
		printf("Sums of %d:\n",t);
		ans_count = 0;
		dfs(t, 0, 1, n, 0);
		if (!ans_count) {
			puts("NONE");
		}
	}
	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值