我并没有去北林校赛,队友回来听他们说了一道题,比较有意思。
http://acm.bjfu.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1332
中心思想,类似背包,每加进来一张
大小为t的
牌,那么所有求值范围内的数量都有
res
[
i
]+=
res
[
i
-
t
];
只给出打表程序:
#include<stdio.h>
#include<cstring>
#include<string.h>
#define mem(x,y) memset(x,y,sizeof(x))
/*题目描述:一副除了大小鬼不在的完整扑克牌。
给出一个1到55的整数,问有多少种方法凑成这个整数*/
int res[60],a[60];
void get55()
{
mem(res,0);
for(int i=0;i<13;i++)
a[i*4]=a[i*4+1]=a[i*4+2]=a[i*4+3]=i+1;
for(int k=0;k<52;k++)
{
int t=a[k];
for(int i=55;i>t;i--)
res[i]+=res[i-t];
res[t]++;
}
}
int main()
{
get55();
for(int i=1;i<=55;i++)
printf("%d\n",res[i]);
}