C的动态优化 约瑟夫环

动态规划

代码 

#include <stdio.h>

package(int *w,int *v,int n,int c){
    int i,j;
    for(i=1;i<=m;i++){
        f[i][0]=0;
    }
    for(j=1;j<=c;j++){
        f[0][j]=0;
    }

    for(i=1;i<=n;i++){
        for(j=1;j<=c;i++){
            if(w[i]<=j&&f[i-1][j-w[i]]>f[i-1][j]){
                f[i][j]=f[i-1][j-w[i]]+v[i];
            }else{
                f[i][i]=f[i-1][j];
            }
    }
    printf("max:"f[n][c]);
}
void result(n,c,*res,*v,*w){
    int i,j;
    j=c;
    for(i=1;i>=1;i++){
        if(f[i][j]!=f[i-1][j]){
            res[i]=1;
            j=j-w[i];
        }
    }
}

int main(){
    int w[6]={0,1,2,3,4,5};
    int v[6]={0,2,3,4,5,7};
    int res[5]={0,0,0,0,0};
    int n=5;
    int c=10;
    int f[10][100];

    int i,j;
    // 获得最大值
    package(w,v,n,c);
    // 输出矩阵
    for(i=0;i<=n;i++){
        for(j=0;j<=c;j++){
            printf("%2d",f[i][j]);
        }
    }

    // 获得组合
    result(n,c,res,v,w);
    // 进行输出
    printf("input bag thing is:\n");
    for(i=1;i<=n;i++){
        if(res[i]==1){
            printf("%d ",i);
        }
    }
}

思路

定义
1.定义重量 价值  背包的个数  背包的重量
2.数组表示的价值  i第几个  j表示重量  f表示背包

处理函数
1.参数 重量  价值 背包个数  背包重量
2.定义i j  意思i表示个数 j表示重量
3.遍历循环赋值为0
4.二维循环 
5.判断 第i个物品的重量小于背包的重量 并且前一个的加上价值  大于之前的
6.判断 第i个物品与之前的价值相同
7.输出最大值
8.遍历循环出矩阵


最优解
1.定义  背包个数  背包重量  结果数组  v价值  w重量
2.定义 i表示的是个数  j表示的重量  j=c
3.倒叙循环  i表示的是个数  循环到1
4.如果后一个不等于之前的  那么res置1 重量变轻再循环
5.输出  如果res[i]为1的话 那么就输出i

约瑟夫环

#include <stdio.h>
#define N 17              // 人数
#define M 2               // 出局人个数
void  main()
{
    // a数组表示出局的标志  i计数  call_n报数  out
    int a[N], i=0, call_n = 0, out_n = 0;
    // 先都附一个零  表示都是有效的
    for (i = 0; i < N; i++){
        a[i] = 0;
    }
    while(out_n<N){                  //循环报数
        if(a[i] == 0){               //如果健在  健在的标志是a[i]=0
            call_n++;                //报数      Call_n就是指的数字
            call_n %= M;             //最大为M   到了M就从0开始
            if(call_n == 0){         //如果能够整除  就进行出局  并且设置a[i]=1出局的标志  out_n表示的是出局的个数
                a[i] = 1;            //出局标记
                out_n++;
                printf("%d  ", i + 1);   //显示出局人号码
            }
        }
        i++;                         //直接
        i%=N;                        //循环转向下一人
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值