201971010223-刘温元 实验二 个人项目《{0-1}背包问题》项目报告

项目 内容
班级博客链接 课程班级
作业要求链接 作业要求
课程学习目标 1.使用GitHub进行项目托管。2.掌握GitHub发布软件的操作方法。3.掌握个人软件项目的开发步骤。4.熟练掌握PSP流程。
项目仓库链接地址 仓库地址

任务一

作业点评链接:

-点评一
-点评二
-点评三

任务二

阅读《构建之法》掌握PSP流程

-PSP是一种可用于控制、管理和改进个人工作方式的自我持续改进过程,是一个包括软件开发表格、指南和规程的结构化框架。PSP与具体的技术相对独立,其原则能够应用到几乎任何的软件工程任务之中。PSP能够说明个体软件过程的原则; 帮助软件工程师作出准确的计划;确定软件工程师为改善产品质量要采取的步骤;建立度量个体软件过程改善的基准;确定过程的改变对软件工程师能力的影响。

PSP展示2

PSP2.1 任务内容 计划完成需要的时间{min) 实际完成需要的时间(min)
Planning 计划 15 14
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 10 8
Development 开发 600 707
Analysis 需求分析 (包括学习新技术) 25 20
Design Spec 生成设计文档 30 20
Design Review 设计复审 (和同事审核设计文档) 30 20
Coding Standard 代码规范 (为目前的开发制定合适的规范) 15 20
Design 具体设计 60 49
Coding 具体编码 300 350
Code Review 代码复审 100 108
Test 测试(自我测试,修改代码,提交修改) 100 125
Reporting 报告 50 50
Test Report 测试报告 15 10
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 30 30

任务三

需求分析

-正确读入实验数据文件的有效{0-1}KP数据
-能够绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图
-能够对一组{0-1}KP数据按价值重量比进行非递增排序
-用户能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位)
-任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件

设计实现

-1.读入实验数据:

FILE *fp;
    char filename[30],x[31];
    cout<<"请输入要读出数据的文件名(带后缀):\n";
    gets(filename);
    if((fp=fopen(filename,"r+"))==NULL){
        printf("ERROR!\n");
        exit(0);
    }

-2.贪心算法法

int KnapSack1(int i){
	if(i>n-1){
	    if(bestValue < cv && cw + goods[i].wight <= C){
	        for(int k=0;k<n;k++)
	            X[k] = cx[k];//存储最优路径
	        bestValue = cv;
	    }
	    return bestValue;
	}
	cw = cw + goods[i].wight;
	cv = cv + goods[i].value;
	cx[i] = 1;//装入背包
	KnapSack1(i+1);
	cw = cw-goods[i].wight;
	cv = cv-goods[i].value;
	cx[i] = 0;//不装入背包
	KnapSack1(i+1);
	return bestValue;
}

-3.动态规划算法

int KnapSack2(int n,struct goods a[],int C,int x[]){
    int V[N][10*N];
    for(int i = 0; i <= n; i++)//初始化第0列
        V[i][0] = 0;
    for(int j = 0; j <= C; j++)//初始化第0行
        V[0][j] = 0;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= C; j++)
        if(j < a[i-1].wight)
            V[i][j] = V[i-1][j];
        else
            V[i][j] = MAX(V[i-1][j],V[i-1][j-a[i-1].wight] + a[i-1].value);

    for(int i = n,j = C; i > 0; i--){
        if(V[i][j] > V[i-1][j]){
            x[i-1] = 1;
            j = j - a[i-1].wight;
        }
        else
            x[i-1] = 0;
    }
    return V[n][C];
}

-4.回溯算法

int BackTrack(int i){
    if(i > n-1){
        if(bestValue < cv){
            for(int k = 0; k < n; k++)
                X[k] = cx[k];//存储最优路径
            bestValue = cv;
        }
        return bestValue;
    }
    if(cw + goods[i].wight <= C){//进入左子树
        cw += goods[i].wight;
        cv += goods[i].value;
        cx[i] = 1;//装入背包
        BackTrack(i+1);
        cw -= goods[i].wight;
        cv -= goods[i].value;//回溯,进入右子树
    }
    cx[i] = 0;//不装入背包
    BackTrack(i+1);
    return bestValue;
}

测试结果

1.读入数据及各算法结果:

经验总结:

  • 本次项目对我来说是一次挑战,在逐步完成项目的过程中,我也掌握了一些新的知识.首先就是PSP流程,在完成项目的过程中刚开始没有按照要求先写PSP流程,导致我一开始无从下手,学习了解PSP的过程中,我认识到了PSP对软件项目开发的重要性.之后便按照PSP流程逐步进行自己的项目,在开发项目的过程中,遇到了困难.自己平时对书写代码的疏忽导致我在代码开发的过程频繁出错,为此我在网上查阅了许多资料,浪费了很多时间.千里之行始于足下,要想提高自己的代码水平,只能多读,多写.同时还要注重基础,根基越牢靠,自己才能走得越远

任务四(项目提交):

posted @ 2022-03-22 08:04  njajndjJvnk  阅读(47)  评论(1编辑  收藏  举报