1.蔡勒公式求星期
2.递归算法分组
3.背包问题
1.用蔡勒公式求星期
蔡勒公式(有多个,这里就写我熟悉的一个):
w=(y+y/4+c/4-2c+26(m+1)/10+d-1)%7;
w:所求星期
y:年份的后两位数
c:年份的前两位数
m:月份(几月)
d:日期(几号)
注意:
1.当m为1或2月份时,你的把它当作是上一年的13或14月份带进去计算
2.当求的w小于0时要将w加上7,当w等于0时,为星期天
举例:黑色星期五
黑色星期五源于西方的宗教信仰与迷信:耶稣基督死在星期五,而13是不吉利的数 字。两者的结合令人相信当天会发生不幸的事情。星期五和数字13都代表着坏运气,两个不幸的个体最后结合成超级不幸的一天。所以,不管哪个月的13日又恰逢星期五就叫“黑色星期五”。找出一年内有有哪些天是“黑色星期五”。
代码如下
#include <stdio.h>
int main()
{
int year;
int y,c,m,d,w;
printf("请输入你想查找的年份:");
scanf("%d",&year);
y = year % 100;
c = year / 100;
for(int i=1; i<=12; i++)
{
m = i;
if(i==1 || i==2)
{
m = i+12;
y = y-1;
}
w = (y+y/4+c/4-2*c+26*(m+1)/10+13-1)%7;
if(w<0) w+=7;
if(i==1 || i==2)
y++;
if(w == 5)
{
printf("%d-%d-%d\n",year,i,13);
}
}
return 0;
}
运行结果:
2.用递归算法求组合
示例:将从6物品中取3个有哪几种方式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10000
#define M 3
char GROUP[N][M+1];//注意要留个位置给'\0',不然不好打印,scanf以'\0'打印结束
char group[M];
int L = 0;
void Combination(char *str,int len,int m) {
//整体思路
//从后往前选,先选第一个位置的元素,一共有4中选法:f,e,d,c(因为要留出两个元素给第二第三个位置)
//再选第二个位置的元素,从第一个位置的元素的后面开始选取,例如当第一个选取了f,那就有4种选法:e,d,c,b
//再选第三个位置,从第二个位置的元素的后面开始选取,当第二个位置选区了e,那就有4种选法,依次类推
//最后到了第一个位置选到c时,只有一种选法cba组合结束,跳出递归
if(m == 0) {
for(int i=M-1; i>=0; i--) {
GROUP[L][i] = group[i];
}
L++;
return ;
}
for(int i=len; i>=m; i--) {
group[m-1] = str[i-1];
Combination(str,i-1,m-1);
}
}
int main() {
char str[] = {'a','b','c','d','e','f'};
int len = sizeof(str);
int m = M;
char ch;
Combination(str,len,m);
for(int i=0; i<L; i++) {
ch = (i==3 || (i-3)%4 == 0)?'\n':'\t';
printf("%s%c",GROUP[i],ch);
}
}
运行结果:
3.背包问题
//有物品标号为1,2,3,4,物品大小为2,3,4,5,物品价值为3,4,5,6的物品
//现在有一个容量为8的1级包,问这个一级包能最大能装多少价值的物品
//整体思路
//定义2个1维数组value[5]={0,3,4,5,6},big={0,2,3,4,5}
//定义一个2维数组v[i][j]用来表示容量为j的一级包装的前i个物品的最大价值
//首先初始化数组为0,当i==0||j==0时,v[0][j]||v[i][0]==0,
//然后选区i=1时j分别选取1,2,3,4,5,6,7,8时的值
/*
v[1][1] = 0:第一个物品的大小为2,而一级包的容量只有1无法装入,
此时有v[1][1] == v[0][1] == 0,因为第一个物品无法装那相当于物品少了一件
*/
/*
v[1][2] = 2:一级包容量加1可以装入第一个物品,此时有两种情况,
第一:我选择装,但装了价值不一定是最大的,
第二,我选择不装,去装留着空间去装后面价值更大的物品,此时v[1][2]=max(v[0][2],v[0][2-big[1]]+value[1])结果为2
*/
//.....
/*v[4][8]:第四个商品的大小为5<8,因此v[4][8]=max(v[3,8],v[0][8-big[4]]+value[4])
v[3][8]:第三个物品大小为4<8,因此v[3][8] = max(v[2,8],v[2,8-big-[3]]+value[3])
.......
最后算出v[4][8] = 10;
*/
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int main()
{
int value[] = {0,3,4,5,6};
int big[] = {0,2,3,4,5};
int bag = 8;
int v[5][9] = {0};
for(int i=1; i<5; i++)
{
for(int j=1; j<9; j++)
{
if(big[i] > j) v[i][j] = v[i-1][j];
else v[i][j] = max(v[i-1][j],v[i-1][j-big[i]]+value[i]);
}
}
printf("v[4][8] = %d",v[4][8]);
}
运行结果: