【试题四】0-1背包问题
阅读下列说明和C代码,回答问题1至问题3。
【说明】
0-1背包问题定义为:给定i个物品的价值v[1…i]、小重量w[1...i]和背包容量T,每个物品装到背包里或者不装到背包里。求最优的装包方案,使得所得到的价值最大。
0-1背包问题具有最优子结构性质。定义c[i][T]为最优装包方案所获得的最大价值,则可得到如下所示的递归式。
【c代码】
下面是算法的C语言实现。
(1)常量和变量说明
T: 背包容量
v[]:价值数组
w[]:重量数组
c[][]:c[i][j]表示前i个物品在背包容量为j的情况下最优装包方案所能获得的最大价值
(2) C程序
#include <stdio.h>
#include <math.h>
#define N 6
#define maxT 1000
/*
变量说明
T:背包容量
v[]:价值数组
w[]:重量数组
c[][]:c[i][j]表示前i个物品在背包容量为j的情况下最优装包方案所能获得的最大价值
*/
int c[N][maxT]={0};
int Memoized_Knapsack(int v[N],int w[N],int T) {
int i;
int j;
for(i=0; i<N; j++){
for(j=0; j<=T; j++){
c[i][f]= -1;
}
}
return Calculate_Max_Value(v, w, N-1, T);
}
int Calculate_Max_Value(int v[N],int w[N], int i, int j){
int temp =0;
if (c[i][j]!=-1){
return c[i][j];//填空1
}
if (i==0||j==0){
c[i][j]=0;
}else{
c[i][j]=Calculate_Max_Value(v, w, i-1, j);
if(temp<c[i][j]){//填空2
temp=c[i][j];//填空3
if(c[i][j]<temp){
c[i][j]=temp;//填空4
}
}
}
return c [i][j];
}
【问题1】(8分)
根据说明和C代码,填充C代码中的空(1) ~ (4)。
【问题2 】(4分)
根据说明和C代码,算法采用了 (5) 设计策略。在求解过程中,采用了(6)
(自底向上或者自顶向下)的方式。
【问题3】 (3分)
若5项物品的价值数组和重量数组分别为v[]= {0,1,6,18,22,28}和w[]= {0,1,2,5,6,7}背包容量为T= 11,则获得的最大价值为 (7) 。
【试题五】文件管理系统(Java)
阅读下列说明和Java代码,将应填入(n) 处的字句写在答题纸的对应栏内。
【说明】
某文件管理系统中定义了类OfficeDoe和DocExplorer。当类OfficeDoe发生变化时,类DocExplorer的所有对象都要更新其自身的状态。现采用观察者(Observer) 设计模式来实现该需求,所设计的类图如图6-1所示。
【Java代码】
package test_2019_2;
import java.util.*;
interface Observer{
public void update(); //填空1
}
interface Subject{
public void Attach(Observer obs);
public void Detach(Observer obs);
public void Notify();
public void setStatus(int staus);
public int getStatus();
}
class OfficeDoc implements Subject{
private List<Observer> myObs;//填空2
private String mySubjectName;
private int m_status;
public OfficeDoc (String name){
mySubjectName=name;
this.myObs=new ArrayList<Observer>();
m_status=0;
}
public void Attach(Observer obs){this.myObs.add(obs);}
public void Detach(Observer obs){this.myObs.remove(obs);}
public void Notify(){
for(Observer obs:this.myObs){
obs.update();//填空3
}
}
public void setStatus(int status){
m_status=status;
System.out.println("SetStatus Subject["+mySubjectName+"]status:"+status);
}
public int getStatus(){return m_status;}
}
class DocExplorer implements Observer {
private String myObsName;
public DocExplorer(String name, Subject sub) {//填空4
myObsName = name;
sub.Attach(this);//填空5
}
public void update() {
System.out.println("update observer[" + myObsName + "]");
}
}
public class ObserverTest {
public static void main(String[] args) {
System.out.println("Hello Wprld!");
Subject subjectA=new Subject() {
@Override
public void Attach(Observer obs) {
}
@Override
public void Detach(Observer obs) {
}
@Override
public void Notify() {
}
@Override
public void setStatus(int staus) {
}
@Override
public int getStatus() {
return 0;
}
};
Observer observerA = new DocExplorer("observerA",subjectA);
subjectA.setStatus(1);
subjectA.Notify();
}
}