P1118 [USACO06FEB]数字三角形`Backward Digit Su`…

杨辉三角的带权应用,杨辉三角用组合数推,(记得从二开始),什么数组该赋什么值想好了再写

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int f[13][14],n,summ,sum,w[14],ff;
bool vis[13];
void zu_he(){
	for(int i=1;i<=n;i++)	f[i][1]=1;
	for(int i=2;i<=n;i++){
		for(int j=2;j<=i;j++){
			f[i][j]=f[i-1][j]+f[i-1][j-1];
		}
	}
}
void dfs(int num){
	if(summ>sum)	return;
	if(num==n+1){
		if(summ==sum){
			for(int i=1;i<=n;i++)
				printf("%d ",w[i]);
			ff=2;
		//	exit(0);
		}
		return;
	}
	if(ff==2)	return;
	for(int i=1;i<=n;i++){
		if(vis[i]){
			vis[i]=0;
			w[num]=i;
			summ+=(f[n][num]*i);
			dfs(num+1);
			if(ff==2)	return;
			summ-=(f[n][num]*i);
			vis[i]=1;
		}
	}
}
int main(){
	scanf("%d%d",&n,&sum);
	for(int i=1;i<=n;i++)	vis[i]=1;
	zu_he();
	dfs(1);
	return 0;
}
原文地址:https://www.cnblogs.com/jindui/p/11634170.html