储油问题
#include<stdio.h>
#define N 10
int main()
{int distance[N] = {500}, oil[N] = {500};
int k;
for(k = 1; distance[k-1] > 0; k++){//坐标大于0则继续循环
distance[k] = distance[k-1] - 500/(2*k + 1);
oil[k] = 500*(k+1);
}
k--;
if(distance[k] < 0){
distance[k] = 0;
oil[k] = 500*k + (2*k + 1)*distance[k-1];
}
printf("\ndistance oil\n\n");
for( ; k >= 0; k--)
printf("%5d,%8d\n", distance[k], oil[k]);
getch();
return 0;
}背包问题
int value[N]; //用来存储各物品的价值 int weight[N]; //用来存储各物品的重量 int maxvalue[N][CONTENT]; //存储最优解
#define CONTENT 5
#define N 10
#include <stdio.h>
void knapsack(int v[N],int w[N], int c, int m[N][CONTENT+1])
{int n = N-1;
int i, j;
int jMax;
/*初始化数组,只有最后一件物品n可选时*/
/**************************************************************/
/*对下面4行代码的说明:当剩余容量c<w[n]时,m数组对应的元素应为0,意即不能选该物品,c>=w[n]时,则为v[n],意即应该选择。比如,设w[n]=4,v[n]为9,背包最大容量为6,则m数组第n行的值应为:
剩余容量: 0 1 2 3 4 5 6
m[n][j]的值: 0 0 0 0 9 9 9 */
/**************************************************************/
for(j = 0; j <= c; j++) //先都清0
m[n][j] = 0;
for(j = w[n]; j <= c; j++) //对于c >= w[n]的情况,改为价值
m[n][j] = v[n];
/*以下求解m[i][j]*/
for(i = n-1; i >= 0; i--) {
if(w[i]–1 < c) //相当于w[i] <=c,物体重量小于等于背包容量
jMax = w[i]-1;
else
jMax = c;
for(j = 0; j <= jMax; j++) //对于剩余容量<物体重量的情况
m[i][j] = m[i+1][j];
for(j = jMax+1; j <= c; j++){ //剩余容量>=物体重量的情况
if(m[i+1][j] >= m[i+1][j-w[i]] + v[i])
m[i][j] = m[i+1][j];
else
m[i][j] = m[i+1][j-w[i]] + v[i];
}
}
}
void traceback(int flag[N], int w[N], int m[N][CONTENT+1])
{int n = N-1;
int i;
int c = CONTENT;
int j;
for(i = 0; i <= n-1; i++)
if(m[i][c] != m[i+1][c]){
flag[i] = 1; //如果两种最优解不同,说明选取了第i件物品
c -= w[i]; //剩余容量减小
}
if(m[n][c]>0) //判断最后一种物品选择与否
flag[n] = 1;
}
void printResult(int flag[], int w[], int v[], int m[][CONTENT+1])
{int i;
printf(" num weight value\n");
for(i = 0; i <= N-1; i++)
if(flag[i] == 1)
printf("%3d%7d%5d\n", i, w[i], v[i]);
printf("content is %d,", CONTENT);
printf("the max value is: %d\n", m[0][CONTENT]);
}
int main()
{int value[N] = { 5,2,3,9,3,6,5,7,8,2};
int weight[N] = {2,1,3,5,7,3,6,2,6,3};
int c = CONTENT;
int maxvalue[N][CONTENT+1];
int flag[N] = {0};
clrscr();
knapsack(value, weight, c, maxvalue);
traceback(flag, weight, maxvalue);
printResult(flag, weight, value, maxvalue);
getch();
return 0;
}链表的逆置
struct student* reverse(struct Student *head)
{struct student *p1,*p2,*t;
p1 = p2 = head;
p1 = p1->next; //指向第二个结点(若有)
while(p1 != NULL) {
t = p1->next;
p1->next = p2; //成为上一个结点的前驱
if(p2 == head) //上一个结点若是第一个结点,使之成为链尾
p2->next = NULL;
p2 = p1; //p2跟上p1
p1 = t; //p1指向下一个结点
}
head = p2; //最后一个结点成为第一个结点
return head;
}struct student* reverse(struct student *head)
{struct student *p, *h, *t;
if(head != NULL){
h = head; //记录原第一个结点的地址
p = head->next; //指向第二个结点
while(p != NULL){
t = p->next; // t记录下一个结点的地址
p->next = head; //*p成为第一个结点的前驱
head = p; //*p成为第一个结点
p = t; // p指向原来的下一个结点
}
h->next = NULL; //最早的第一个结点成为链尾
}
return head;
}约瑟夫环
#include "stdio.h"
#include "stdlib.h"
struct Boy {
int n;
struct Boy *next;
};
void create(struct Boy**, int);
struct Boy* proceed(struct Boy*, int, int, int);
void print(struct Boy*);
void del(struct Boy*);
int main()
{struct Boy *head;
int n,k,m;
clrscr();
scanf("%d,%d,%d", &n, &k, &m);
create(&head, n); //建立链表
if(head == NULL)
exit(0);
head = proceed(head, n, k, m); //报数,处理
print(head); //输出链表
del(head); //删除整个链表,释放内存
getch();
return 0;
}
void create(struct Boy **p,int n)
{struct Boy *p1,*p2;
int i;
for(i = 1; i <= n; i++) {
p1 = (struct Boy*)malloc(sizeof(struct Boy));
if(p1 == NULL){
printf("no space.\n");
*p = NULL;
return;
}
p1->n = i;
if(i == 1)
*p = p1;
else
p2->next = p1;
p2 = p1;
p1->next = *p;
}
}
void print(struct Boy *head)
{struct Boy *p = head;
while(1) {
printf("%5d", p->n);
p = p->next;
if(p == head)
break;
}
}
struct Boy* proceed(struct Boy *head,int n,int k,int m)
{struct Boy *p1,*p2;
int i,count,min; //min表示圈中最小序号,count统计被删除的结点数
p1 = p2 = head;
for(count = 1; count <= n-m; count++){
for(i = 1; i < k; i++){
p2 = p1;
p1 = p1->next;
}
p2->next = p1->next;
p2 = p1; //p2指向要删结点
p1 = p1->next;
free(p2);
}
head = p1;
//以下代码使head指向序号最小的结点,以便按从小到大顺序输出结果
min = p1->n;
for(i = 1; i <= m; i++) {
p1 = p1->next;
if(min > p1->n){
head = p1;
min = p1->n;
}
}
return head;
}
//删除整个链表
void del(struct Boy *head)
{struct Boy *p1,*p2;
p1 = head;
if(p1 != NULL)
while(1) {
p2 = p1;
p1 = p1->next;
free(p2);
if(p1 == head)
break;
}
}
















