分组背包问题Matlab实现——之基本背包变形
来源:互联网 发布:js 表单如何拼接字符串 编辑:程序博客网 时间:2024/05/21 14:43
2016年7月28日星期四
T.s.road总结笔记:分组背包问题Matlab实现——之基本背包扩展
项目源码:https://github.com/Tsroad/KnapsackProblemSeries
作者说明:
Whenrunning thisprogramme, the author’s PC setting is:
MicrosoftWindows 7 (SP1) + Matlab R2010b +CPU i5-4590 + RAM 4.0GB.
(Lab SX309; Check by Keung Charteris or T.s.roadCZQ)
题目
N个数,分成两组,要求两组数的和的差值最小。
基本思路
这是背包问题(上一篇博客介绍了基本背包问题)的变形,背包容量C为Sum/2。第i个数字的价值与重量都等于数字大小。
% 问题描述:% 20个数,分成两组,要求两组数的和的差值最小。% 问题分析% 1. 判断第一个数放或不放;% 2. 判断下一个数是放还是不放;M[i,c]=M[i-1,c] or M[i,c]= M[i-1,c-w(i)]+v(i);% 3. 重复2;% 4. 找出这些数。clc; %清除所有clear all;%清除变量close all;%关闭图片FirstGroup=[]; SecondGroup=[];BagNumberPoints=[38,82,54,36,94,88,56,63,59,21,31,48,24,85,20,23,18,23,44,32];Capacity=ceil(sum(BagNumberPoints)/2)+1;% 背包的容量Weight=BagNumberPoints;% 数字的重量Value=BagNumberPoints;% 数字对应的价钱。NumberOfObject =length(Weight);% 数字的个数TransferMatrix=[];%定义状态转移矩阵ObjectState=[];%背包里数字的状态%1.判断第一个数字放或不放;for FlagTemp=1:Capacity if Weight(NumberOfObject)<FlagTemp TransferMatrix(NumberOfObject,FlagTemp)=Value(NumberOfObject) ; else TransferMatrix(NumberOfObject,FlagTemp)=0; endend% %2.判断下一个数字是放还是不放;不放时:F[i,v]=F[i-1,v];放时:F[i,v]= F[i-1,v-C_i]+w_i;% %3.重复2.for FlagTempExternal=NumberOfObject-1:-1:1 for FlagTemp=1:Capacity if FlagTemp<=Weight(FlagTempExternal) TransferMatrix(FlagTempExternal,FlagTemp)=TransferMatrix(FlagTempExternal+1,FlagTemp); else if TransferMatrix(FlagTempExternal+1,FlagTemp)>TransferMatrix(FlagTempExternal+1,FlagTemp-Weight(FlagTempExternal))+Value(FlagTempExternal) TransferMatrix(FlagTempExternal,FlagTemp)=TransferMatrix(FlagTempExternal+1,FlagTemp); else TransferMatrix(FlagTempExternal,FlagTemp)=TransferMatrix(FlagTempExternal+1,FlagTemp-Weight(FlagTempExternal))+Value(FlagTempExternal); end end endend% TransferMatrix%4.找出这些数字。FlagTempExternal=Capacity;for FlagTemp=1:NumberOfObject-1 if TransferMatrix(FlagTemp,FlagTempExternal)==TransferMatrix(FlagTemp+1,FlagTempExternal) ObjectState(FlagTemp)=0; else ObjectState(FlagTemp)=1; FlagTempExternal=FlagTempExternal-Weight(FlagTemp); endendif TransferMatrix(NumberOfObject,FlagTempExternal)==0 ObjectState(NumberOfObject)=0;else ObjectState(NumberOfObject)=1; endfor FlagTemp=1:NumberOfObject if ObjectState(FlagTemp)==1 FirstGroup=[FirstGroup,BagNumberPoints(FlagTemp)]; else SecondGroup=[SecondGroup,BagNumberPoints(FlagTemp)]; endenddisp('两组数的和分别为:');[sum(FirstGroup);sum(SecondGroup)]disp('第一组为');FirstGroupdisp('第二组为');SecondGroup
运行结果:
0 0
- 分组背包问题Matlab实现——之基本背包变形
- 分组背包问题Matlab实现——之基本背包问题
- 分组背包问题Matlab实现——之基本背包扩展贪心解法
- hdu3033 分组背包变形
- hdu3033(分组背包变形)
- 背包九讲之分组背包问题
- 动态规划——背包问题变形
- 【01背包】问题变形——饭卡
- O题 分组背包变形
- 基本分组背包
- 背包问题(分组背包)
- 简单背包练习——分组背包
- 背包dp之分组背包
- 变形的背包问题
- 背包问题的变形
- 01背包问题-基本实现
- 分组背包问题
- 分组背包问题
- Spring整合HDFS
- struts2文件上传小结
- SEO快速排名算法独家揭秘
- eclipse工程导入androidstudio之后,在androidstudio中修改app包名
- 字典树的应用
- 分组背包问题Matlab实现——之基本背包变形
- ADT新建项目出现appcompat_v7包,删除后styles报错
- spring中的PropertyPlaceholderConfigurer访问properties文件配置
- ORA-28000 用户被锁定
- 工厂模式三 抽象工厂模式
- 51nod - 1136 欧拉函数(欧拉函数)
- sql server 当中Go的用法
- Android数据存储之GreenDao 3.0 详解
- 最近在使用MediaRecorder录制视频的时候遇到crash