c一些基本算法和公式

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]);
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值