{
m[i][j]=tmp;
s[i][j]=k;
}
}
}
}
}
voidOutput(int(*m)[N+1],int(*s)[N+1],intn)//输出m[][]数组
{
inti,j;
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
printf("m[%d][%d]=%d",i,j,m[i][j]);
}
printf("\n");
}
printf("\n");
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
printf("s[%d][%d]=%d",i,j,s[i][j]);
}
printf("\n");
}
}
voidAddBrackets(int(*s)[N+1],intbegin,intend)//输出加括号的方案
{
intk=s[begin][end];
printf("AddBracketsforA%dandA%d,andforA%dandA%d\n",begin,k,k+1,end);
if(k-begin>1)
AddBrackets(s,begin,k);
if(end-(k+1)>1)
AddBrackets(s,k+1,end);
}
四实验结果
实验三:
贪心法 求解背包问题
一实验目的与要求
1、掌握背包问题的算法
2、初步掌握贪心算法
二实验题:
问题描述:
与0-1背包问题相似,给定n种物品和一个背包。
物品i的重量是wi,其价值为vi,背包的容量为c。
与0-1背包问题不同的是,在选择物品i装入背包时,背包问题的解决可以选择物品i的一部分,而不一定要全部装入背包,1
三、实验代码
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclasserextendsJFrame{
privatestaticfinallongserialVersionUID=-1508220487443708466L;
privatestaticfinalintwidth=360;//面板的宽度
privatestaticfinalintheight=300;//面板的高度
publicintM;
publicint[]w;
publicint[]p;
publicintlength;
er(){
//初始Frame参数设置
this.setTitle("贪心算法");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(width,height);
Containerc=getContentPane();
c.setLayout(newBoxLayout(c,BoxLayout.Y_AXIS));
setLocation(350,150);
//声明一些字体样式
FonttopF1=newFont("宋体",Font.BOLD,28);
Fontblack15=newFont("宋体",Font.PLAIN,20);
Fontbold10=newFont("宋体",Font.BOLD,15);
//声明工具栏及属性设置
JPanelbarPanel=newJPanel();
JMenuBartopBar=newJMenuBar();
topBar.setLocation(1,1);
barPanel.add(topBar);
//面板1和顶部标签属性设置
JPanelp1=newJPanel();
JLabeltopLabel=newJLabel("背包问题");
topLabel.setForeground(Color.blue);
topLabel.setFont(topF1);
p1.add(topLabel);
//中间面板和标签及输入框属性设置
JPanelp2=newJPanel();
p2.setLayout(newBoxLayout(p2,BoxLayout.Y_AXIS));
JLabelwLabel=newJLabel("请输入重量:
");
JLabelpLabel=newJLabel("请输入效益:
");
wLabel.setFont(black15);
pLabel.setFont(black15);
//
finalJTextFieldwText=newJTextField(8);
finalJTextFieldpText=newJTextField(8);
//wText.setText("10,8,7,5,9,6");
//pText.setText("15,14,7,10,17,7");
p2.add(wLabel);
p2.add(wText);
p2.add(pLabel);
p2.add(pText);
//
//中下部面板和标签属性设置
JPanelp3=newJPanel();
JLabelbottomLabel=newJLabel(
"注意:
数据输入时请添加分割符','");
bottomLabel.setFont(bold10);
bottomLabel.setForeground(Color.red);
bottomLabel.setHorizontalAlignment(SwingConstants.RIGHT);
p3.add(bottomLabel);
//
JPanelp5=newJPanel();
p5.setLayout(newBoxLayout(p5,BoxLayout.Y_AXIS));
JLabelmLabel=newJLabel("请输入背包总重量:
");
mLabel.setFont(black15);
finalJTextFieldmText=newJTextField(8);
p5.add(mLabel);
p5.add(mText);
//面板和按钮的设置
JPanelp4=newJPanel();
JButtonsubmit=newJButton("确定");
submit.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Strings1=pText.getText();//效益
Strings2=wText.getText();//重量
Strings3=mText.getText();//背包
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
Strings1Copy,s2Copy,s3Copy;
s1Copy=s1;
s2Copy=s2;
s3Copy=s3;
s1Copy=s1Copy.replaceAll(",","");
s2Copy=s2Copy.replaceAll(",","");
s3Copy=s3Copy.replaceAll(",","");
System.out.println(s1Copy);
System.out.println(s2Copy);
System.out.println(s3Copy);
try{
String[]temp=s1.split(",");//按照','分割字符串
p=newint[temp.length];
for(inti=0;ip[i]=Integer.parseInt(temp[i]);//
temp=s2.split(",");
w=newint[temp.length];
for(inti=0;iif(w.length==p.length)
{
length=w.length;
}
else{
JOptionPane.showMessageDialog(null,"长度不等,请检查后重新输入!
");
}
M=Integer.parseInt(s3);
}catch(NumberFormatExceptione2){
e2.printStackTrace();
try{
if(s2.equals("")){
JOptionPane.showMessageDialog(null,"重量不能为空!
");
return;
}
else{
if(s1.equals("")){
JOptionPane.showMessageDialog(null,"效益值不能为空!
");
return;
}else
{
if(s3.equals(""))
JOptionPane.showMessageDialog(null,"总重量不能为空!
");
return;
}
}
}catch(Exceptione3){
//TODO:
handleexception
}
}
//可以执行贪心算法了
int[]wCopy=newint[w.length];
int[]pCopy=newint[w.length];
floattemp2;
inttemp1;
floattotalx=0;
float[]x=newfloat[w.length];//效益和重量的比值
float[]n=newfloat[w.length];//记录个数
float[]nCopy=newfloat[w.length];
for(inti=0;i{
wCopy[i]=w[i];
pCopy[i]=p[i];
}
for(inti=0;ix[i]=(float)((p[i]*1.0)/w[i]);
for(inti=0;ifor(intj=i+1;j{
if(x[i]{
temp2=x[j];
x[j]=x[i];
x[i]=temp2;
temp1=p[j];
p[j]=p[i];
p[i]=temp1;
temp1=w[j];
w[j]=w[i];
w[i]=temp1;
}
}//效益重量比值排序
Backpackb=newBackpack(M,w,p,n);
for(inti=0;ifor(intj=0;j{
if(wCopy[i]==w[j]&&pCopy[i]==p[j])
{
nCopy[i]=b.n[i];
}
}
for(intj=0;jtotalx=totalx+n[j]*p[j];
ShowResults=newShowResult(p,w,length,n,totalx);
}//actionPerformed
});
p4.add(submit);
//p4.add(eButton);
//
JPaneltopPanel=newJPanel();
topPanel.setLayout(newBoxLayout(topPanel,BoxLayout.Y_AXIS));
topPanel.add(p1);
topPanel.add(p2);
topPanel.add(p5);
topPanel.add(p3);
topPanel.add(p4);
c.add(barPanel);
c.add(topPanel);
setVisible(true);
}//构造方法
publicstaticvoidmain(String[]args){
erg=newer();
}//endmain
}
classBackpack{
privateintcapacity;
intlength;//数组元素个数
float[]n;
publicBackpack(intM,int[]w,int[]p,float[]n){
t
展开阅读全文
相关搜索