c语言-C编写的分支限界法解01背包问题嵌入窗口界面代码问题

问题描述

C编写的分支限界法解01背包问题嵌入窗口界面代码问题
用C编写的分支限界法解01背包问题,原来无窗口界面的程序没问题,在嵌入窗口程序后得不出正解。不知代码哪出了问题。求高手修改,急用!
代码:// 123.cpp : Defines the entry point for the application.
//

#include ""stdafx.h""
#include ""resource.h""

#define MAX_LOADSTRING 100
HINSTANCE hInst; // current instance

// Foward declarations of functions included in this code module:
LRESULT CALLBACK About(HWND UINT WPARAM LPARAM);

/////////////////////////////
#define MaxSize 100 //最多结点数
int c;
char input1[MaxSize];
char input2[MaxSize];
char input3[MaxSize];
char input4[MaxSize];

char output1[MaxSize];
char output2[MaxSize];
char output3[MaxSize];

int v1[MaxSize];
int p = 0;
typedef struct QNode
{
int weight;
int value;
int ceng;
struct QNode *parent;
bool leftChild;

}QNode*qnode; //存放每个结点

typedef struct
{

qnode Q[MaxSize];
int frontrear;
}SqQueue; //存放结点的队列

SqQueue sq;
int bestv=0; //最优解
int n=0; //实际物品数
int w[MaxSize]; //物品的重量
int v[MaxSize]; //物品的价值

int bestx[MaxSize]; // 存放最优解
qnode bestE;
void InitQueue(SqQueue &sq ) //队列初始化
{
sq.front=1;
sq.rear=1;
}
bool QueueEmpty(SqQueue sq)
{
if(sq.front==sq.rear)
return true;
else
return false;
}

void EnQueue(SqQueue &sqqnode b)//入队
{
if(sq.front==(sq.rear+1)%MaxSize)
{
// printf(""队列已满!"");
MessageBox((HWND)hInst队列已满""警告""MB_OK);
return;

}
sq.Q[sq.rear]=b;
sq.rear=(sq.rear+1)%MaxSize;
}
qnode DeQueue(SqQueue &sq)//出队
{
qnode e;
if(sq.front==sq.rear)
{
//printf(""队列已空!"");
MessageBox((HWND)hInst队列已空""警告""MB_OK);
return 0;
}
e=sq.Q[sq.front];
sq.front=(sq.front+1)%MaxSize;
return e;
}
void EnQueue1(int wtint vt int i QNode *parent bool leftchild)
{
qnode b;
if (i==n) //可行叶子结点
{
if (vt==bestv)
{
bestE=parent;
bestx[n]=(leftchild)?1:0;
}
return;
}
b=(qnode)malloc(sizeof(QNode)); //非叶子结点
b->weight=wt;
b->value=vt;
b->ceng=i;
b->parent=parent;
b->leftChild=leftchild;
EnQueue(sqb);
}
void maxLoading(int w[]int v[]int c)
{
int wt=0;
int vt=0;
int i=1; //当前的扩展结点所在的
int ew=0; //扩展节点所相应的当前载重量
int ev=0; //扩展结点所相应的价值

char temp1[MaxSize];char temp2[MaxSize];int q ;qnode e=NULL; qnode t=NULL; InitQueue(sq); EnQueue(sqt);       //空标志进队列while (!QueueEmpty(sq)) {     wt=ew+w[i];     vt=ev+v[i]; if (wt <= c) {     if(vt>bestv)     bestv=vt;     EnQueue1(wtvtietrue);   // 左儿子结点进队列} EnQueue1(eweviefalse);        //右儿子总是可行;e=DeQueue(sq);         // 取下一扩展结点if (e == NULL) {     if (QueueEmpty(sq))   break;     EnQueue(sqNULL);        // 同层结点尾部标志    e=DeQueue(sq);      // 取下一扩展结点    i++; } ew=e->weight;       //更新当前扩展结点的值ev=e->value; } 

// printf(""最优价值为:%.0fnn""bestv);
itoa(bestvoutput110);
// printf(""最优s取法为:n"");
for( int j=n-1;j>0;j--) //构造最优解
{
bestx[j]=(bestE->leftChild?1:0);
bestE=bestE->parent;
}
p = 0;
q = 0;
for(int k=1;k<=n;k++)
{
if(bestx[k]==1){}
// printf(""n物品%d:重量:%.0f,价值:%.0fnn""kw[k]v[k]);
itoa(v[k]temp110);
itoa(w[k]temp210);
for(int i = 0;i<strlen(temp1);i++)
{
output2[q++] = temp1[i];
}
for(i = 0;i<strlen(temp2);i++)
{
output3[p++] = temp2[i];
}
}

output2[--q] = '';output3[--p] = '';//v[] --> output2;  char *;//w[] --> output3;

}
////////////////////////////
// Global Variables:

int APIENTRY WinMain(HINSTANCE hInstance
HINSTANCE hPrevInstance
LPSTR lpCmdLine
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
// HACCEL hAccelTable;

    DialogBox(hInst (LPCTSTR)IDD_ABOUTBOX 0 (DLGPROC)About);return msg.wParam;

}

LRESULT CALLBACK About(HWND hDlg UINT message WPARAM wParam LPARAM lParam)
{
int temp = 0;
int power = 1;
int q = 0;
switch (message)
{
case WM_INITDIALOG:
return TRUE;

    case WM_COMMAND:        if (LOWORD(wParam) == IDCANCEL)         {            EndDialog(hDlg LOWORD(wParam));            return TRUE;        }        if(LOWORD(wParam) == IDOK)        {            GetDlgItemText(hDlgIDC_EDIT1input1MaxSize);            n = atoi(input1);            GetDlgItemText(hDlgIDC_EDIT2input2MaxSize);            c = atoi(input2);            GetDlgItemText(hDlgIDC_EDIT3input3MaxSize);            //input3 ->> int v[];            for(int i = strlen(input3)-1;i>=0;i--)            {                if(input3[i] != ' ')                {                    n += (input3[i]-'0')*power;                    power *= 10;                }                else                {                    v1[q++] = n;                    n = 0;                    power = 1;                }            }            v1[q++] = n;            for(i = q-1;i>=0;i--)            {                v[p++] = v1[i];            }            GetDlgItemText(hDlgIDC_EDIT4input4MaxSize);            //input4 ->> int w[];            q = 0;            p = 0;            n = 0;            power = 1;            for(i = strlen(input4)-1;i>=0;i--)            {                if(input4[i] != ' ')                {                    n += (input4[i]-'0')*power;                    power *= 10;                }                else                {                    v1[q++] = n;                    n = 0;                    power = 1;                }            }            v1[q++] = n;            for(i = q-1;i>=0;i--)            {                w[p++] = v1[i];            }                       maxLoading(w v c);            SetDlgItemText(hDlgIDC_EDIT5output1);            SetDlgItemText(hDlgIDC_EDIT6output2);            SetDlgItemText(hDlgIDC_EDIT7output3);        }        break;}return FALSE;

}

时间: 2024-11-05 04:01:25

c语言-C编写的分支限界法解01背包问题嵌入窗口界面代码问题的相关文章

c++-0-1背包问题(动态规划)

问题描述 0-1背包问题(动态规划) 代码敲出来了但是提交是错的,我也不知道为什么了,题目和代码都在下面,帮我看看吧!!! 题目如下: Problem Description 给定n种物品和1个背包,物品i的重量是wi,其价值为vi,背包的容量为C.要求选择装入背包的物品,使得装入背包中物品的总价值最大. Input 每组测试数据包含3行,第1行为n和c,表示有n(0<=n<=400)个物品且背包容量为c (c<=1500),第二行为这n个物品的重量wi(1<=wi<=100

c语言-C语言怎样编写程序运行完后,不自动结束,而是返回程序的开始的主菜单?

问题描述 C语言怎样编写程序运行完后,不自动结束,而是返回程序的开始的主菜单? 我的程序运行完一个功能后按任意键就退出了,而不是返回主菜单 代码如下,应该怎么改?(具体一点,菜鸟一个)多谢! #include #include #include #include #include #define LENTEL sizeof(tel) #define ID struct tel struct tel { char name[15]; char tele[11]; char style[15]; c

c-想问一种软件实现的方法 这种软件用什么平台或者用什么语言来编写

问题描述 想问一种软件实现的方法 这种软件用什么平台或者用什么语言来编写 我想用电脑连接一个传感器 通过传感器探测手在一个方形区域内的位置(2维就可以) 然后让电脑生成一个窗口 这个窗口显示一个方形区域(对应实际的方形区域)还有两个圆(代表两只手的位置)随着手的移动 窗口内的两个圆也随之移动

sdl-求一个用C语言+SDL编写俄罗斯方块的代码

问题描述 求一个用C语言+SDL编写俄罗斯方块的代码 跪求一个用C语言+SDL编写俄罗斯方块的代码,实在是不理解,求救 解决方案 http://blog.csdn.net/sinat_22657459/article/details/43762831 解决方案二: http://wenku.baidu.com/link?url=s7tecFl56PbYskhLPNApD-hSmCIyT638XlFeOTIcRaTenPDYef_y3cqJbUtvhMg7Lfep2HqmvDTL55aCeGTwe

跪求大神-数据结构c语言版 编写:判定二叉树是完全二叉树。

问题描述 数据结构c语言版 编写:判定二叉树是完全二叉树. 求大神,感激不尽 2015-12-22下午2点之前希望有大神解答. 解决方案 无非就是递归遍历,判断参考:http://www.cnblogs.com/buptLizer/archive/2012/03/30/2425097.html 解决方案二: 数据结构(C语言版)摘录--树和二叉树数据结构 二叉树的实现 c语言版C语言数据结构-二叉树

着急-这些sql语言对应的C#语言怎么编写?

问题描述 这些sql语言对应的C#语言怎么编写? //-------------------------------//考卷内容表drop table examcontent;create table ExamContent( Pid number(40) not null Tid number(40) null Type number(40) null Source number(10) null Answer varchar2(4000) null FullMark number(31) n

HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)

原文:HTML5 canvas绘制雪花飘落动画(需求分析.知识点.程序编写分布详解) 看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现:虽然哦很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难点分析. 我这几天刚好学习了一下,也趁着此刻有时间从需求分析.知识点.程序编写一步步给大家解剖下,要是在各位关公面前耍大刀了,可别见笑哟. 最终效果图如下: 图1 一.需求分析 1.圆形雪花 本示例中雪花形状使用圆

服务器-C语言 socket 编写简单服务端客户端通信问题

问题描述 C语言 socket 编写简单服务端客户端通信问题 大家好,感谢你的回复. 我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了. Talk is cheak , show me the code. 服务端代码: #include<stdlib.h> #include<WinSock2.h> #pragma comment(lib,"ws2_32.lib") i

c语言编写-C语言怎么编写这个算法?

问题描述 C语言怎么编写这个算法? 设a,b,c,d是4个塔座.开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起.各圆盘从小到大编号为1,2,3,...n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍然按同样顺序重叠.在移动圆盘时应该遵守以下移动规则. 规则1,每次只能移动1个圆盘: 规则2,任何时刻都不允许将较大的圆盘压在较小的圆盘之上: 规则3,在满足移动规则1和规则2的前提下,可将圆盘移至a,b,c,d任一塔座上. 解决方案 汉诺塔算法 void move(cha