动态规划
代码
#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; //循环转向下一人
}
}