You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pmj8gckvu 7aaaeb5352
Update README.md
3 years ago
README.md Update README.md 3 years ago

README.md

#include<stdio.h>
#define max(x,y)((x)>(y)?(x):(y))
#define MAXN 20  //最多物品数
#define MAXW 100 //最大限制重量
// 问题表示
int n=5,W=10; // 5种物品,限制重量不超过10
int w[MAXN]={0,2,2,6,5,4}; // 声明整型数组w和v分别表示物品的重量和价值
int v[MAXN]={0,6,3,5,4,6}; // 下标为0的元素不用
// 求解结果表示
int maxv = 0; // 存放最优解的总价值
// 递归函数
int Knap(int i, int r) {
    if (i == 0 || r == 0) { //当物品的序号 i 达到0或者背包容量 r 达到0时递归边界条件满足返回0表示不再考虑剩余的物品或剩余的背包容量。
        return 0;
    }
    if (r < w[i]) { // 当前物品的重量 w[i] 大于背包容量 r无法放入当前物品递归调用 knap(i-1, r),即不考虑当前物品,继续考虑下一个物品的情况。
        return Knap(i-1, r);
    } else {
        // 选择放入当前物品或不放入当前物品,取较大值作为最终结果
        return max(Knap(i-1, r), Knap(i-1, r-w[i]) + v[i]);
        // 表示放入当前物品,递归调用 knap(i-1, r-w[i]),计算考虑当前物品时背包的剩余容量,然后加上当前物品的价值 v[i]。
    }
}
int main() {
    maxv = Knap(n, W);
    printf("求解的结果(最优方案)\n");
    printf("选取的物品:");
    // 构造x数组
    int x[MAXN] = {0};
    int i = n, r = W;//i为物品的序号r为背包的剩余容量
    while (i >= 0 && r > 0) {
        if (i > 0 && Knap(i, r) != Knap(i-1, r)) {
            x[i] = 1;//将数组 x 的第 i 个元素设为1表示将第 i 个物品选中放入背包。
            r = r - w[i];//将当前容量 r 减去选中物品 i 的重量,表示已经放入该物品后的剩余容量。
        }
        i--;//将物品索引 i 减1继续检查下一个物品。
    }
    for (i = 1; i <= n; i++) {
        if (x[i] == 1) {
            printf("%d ", i);//如果 x[i] 等于1表示第 i 个物品被选中放入背包中。
        }
    }
    printf("\n");
    printf("总价值=%d", maxv);
}
#include<stdio.h>
int fib(int n){
	if(n<=2){
		return n;
	}else{
		return fib(n-1)+fib(n-2);
	}
}
int main(){
	int n;
	printf("请输入想打印的斐波拉契数列:\n");
	scanf("%d",&n);
	printf("斐波那契数列:\n");
	for(int i = 0;i<=n;i++){
		printf("%d ",fib(i));
	} 
	return 0;
}
#include<stdio.h>
typedef struct{
	int number;
	int count;
} Mode;
Mode findMode(int arr[],int n){
	Mode mode = {arr[0],1};
	int count = 1;
	int maxCount = 1;
	for(int i=0;i<n;i++){
		if(arr[i] == arr[i-1]){
			count++;
		}else{
			if(count>maxCount){
				mode.number = arr[i-1];
				mode.count = count;
				maxCount = count;
			}
			count = 1;
		}
	}
	if(count>maxCount){
		mode.number = arr[n-1];
		mode.count = count;
	}
	return mode;
} 
int main(){
	int arr[] =  {1,2,2,2,3,3,5,6,6,6,6};
	int n = sizeof(arr)/sizeof(arr[0]);
	printf("递增序列: ");
	for (int i = 0; i < n; i++)//输出待求众数序列中的元素;
	printf("%d ",arr[i]);
	printf("\n");
	Mode result = findMode(arr,n);
	printf("众数为:%d,重数为:%d",result.number,result.count);
	return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define max(a,b)((a)>(b)?(a):(b))
typedef struct TreeNode{
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
}TreeNode;
int maxPathHelper(TreeNode *root,int *maxSum){
	if(root==NULL){
		return 0;
	}
	int leftSum = maxPathHelper(root->left,maxSum);
	int rightSum = maxPathHelper(root->right,maxSum);
	int currSum = max(max(root->val,root->val+leftSum+rightSum),
					max(root->val+leftSum,root->val+rightSum));
	*maxSum = max(*maxSum,currSum);				 
	return max(root->val,max(root->val+rightSum,root->val+leftSum));
} 
int maxPathSum(TreeNode *root){
	if(root==NULL){
		return 0;
	}
	int maxSum = 0;
	maxPathHelper(root,&maxSum);
	return maxSum;
}
TreeNode* createTreeNode(int val){
	TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
	newNode->val=val;
	newNode->left=NULL;
	newNode->right=NULL;
	return newNode; 
}
int main(){
	TreeNode* root = createTreeNode(-10);
	root->left=createTreeNode(9);
	root->right=createTreeNode(20);
	root->right->left=createTreeNode(15);
	root->right->right=createTreeNode(7);
	int maxSum = maxPathSum(root);
	printf("最大的路径和为:%d",maxSum);
	free(root->left);
	free(root->right);
	free(root);
	return 0; 
}