HDU 4504

直接DP求组合数即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define LL __int64
using namespace std;

LL dp[21][70];

void Init(){
	memset(dp,0,sizeof(dp));
	dp[0][0]=1ll;
	for(int i=1;i<21;i++){
		for(int j=1;j<70;j++){
			if(j-1>=0) dp[i][j]+=dp[i-1][j-1];
			if(j-2>=0) dp[i][j]+=dp[i-1][j-2];
			if(j-3>=0) dp[i][j]+=dp[i-1][j-3];
		}
	}
//	int ans=0;
//	for(int i=0;i<70;i++)
//	ans+=dp[20][i];
//	printf("%d
",ans);
}

int main(){
	Init();
	int a,b,t;
	while(scanf("%d%d%d",&a,&b,&t)!=EOF){
		t=t/15;
		b+=(t/2);
		LL ans=0;
		if(b<a){
			t=t-t/2;
			for(int i=0;i<70;i++)
			ans+=dp[t][i];
		}
		else{
			int g=b-a;
		//	cout<<g<<endl;
			t=t-t/2;
		//	cout<<t<<endl;
			for(int i=g+1;i<70;i++)
			ans+=dp[t][i];
		}
		printf("%I64d
",ans);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/jie-dcai/p/4368049.html