matlab动态规划问题。

这里我只列出了订购4套和5套的情况,一开始以为能弄出所有排列情况即可,但是结果是我写的排列中没有出现数字有重复的排列,类似于(1,1,2)(1,1, 3)这样的有重复数字的排列,导致计算订购5套时只得到答案时(0,2,3),未得到正确答案(1,1,3),如何在此代码上进行修改从而把有重复数字的排列加进去?

img

clc;clear;
A=[ 0 1 2 3 4];
A1=[0 1 2 3 4 5];
A2=[0 1 2 3 4 5 6];
B=nchoosek(A,3);
B1=nchoosek(A1,3);
B2=nchoosek(A2,3);
C=fliplr(B);
C1=fliplr(B1);
C2=fliplr(B2);
sum=[B;C];
sum1=[B1;C1];
sum2=[B2;C2];
[m,n]=size(sum);
[m1,n1]=size(sum1);
[m2,n2]=size(sum2);
blank=zeros(m,1);
blank1=zeros(m1,1);
blank2=zeros(m2,1);
%%
for i=1:m
        a4=sum(i,1);
        switch a4
            case 0
                a1=0;
            case 1
                a1=3;
            case 2
                a1=5;
            case 3
                a1=6;
            case 4
                a1=7;
        end
                
            
        b4=sum(i,2);
        switch b4
            case 0
                b1=0;
            case 1
                b1=4;
            case 2
                b1=6;
            case 3
                b1=7;
            case 4
                b1=8;
        end
            
        c4=sum(i,3);
        switch c4
            case 0
                c1=0;
            case 1
                c1=2;
            case 2
                c1=5;
            case 3
                c1=9;
            case 4
                c1=8;
        end
        if a4+b4+c4==4
        sum11=a1+b1+c1;
        blank(i,1)=sum11;
        end
    
end
MAX=max(blank);
[q,w]=find(blank==MAX);
final=sum(q,:)
%%
for i=1:m1
        a5=sum1(i,1);
        switch a5
            case 0
                a1=0;
            case 1
                a1=3;
            case 2
                a1=5;
            case 3
                a1=6;
            case 4
                a1=7;
            case 5
                a1=6;
                
                
        end
                
            
        b5=sum1(i,2);
        switch b5
            case 0
                b1=0;
            case 1
                b1=4;
            case 2
                b1=6;
            case 3
                b1=7;
            case 4
                b1=8;
            case 5
                b1=9;
        end
            
        c5=sum1(i,3);
        switch c5
            case 0
                c1=0;
            case 1
                c1=2;
            case 2
                c1=5;
            case 3
                c1=9;
            case 4
                c1=8;
            case 5
                c1=8;
        end
        if a5+b5+c5==5
        sum22=a1+b1+c1;
        blank1(i,1)=sum22;
        end
end
        MAX1=max(blank1);
[q1,w1]=find(blank1==MAX1);
final1=sum1(q1,:)

1)当可分配设备数为4时,最终得到最优决策为(0,1,3)即1分厂不分配设备,2分厂分配1个设备,3分厂分配3个设备,得到最优解为13万元
2)当可分配设备数为5时,最终得到最优决策为(1,1,3)即1分厂分配1台设备,2分厂分配1台设备,3分厂分配3个设备,得到最优解为16万元

更改如下:

clear all
clc
% clc;clear;
% A=[ 0 1 2 3 4];
% A1=[0 1 2 3 4 5];
% A2=[0 1 2 3 4 5 6];
% B=nchoosek(A,3);
% B1=nchoosek(A1,3);
% B2=nchoosek(A2,3);
% C=fliplr(B);
% C1=fliplr(B1);
% C2=fliplr(B2);
% sum=[B;C];
% sum1=[B1;C1];
% sum2=[B2;C2];
% [m,n]=size(sum);
% [m1,n1]=size(sum1);
% [m2,n2]=size(sum2);
blank=0;
blank1=0;
% blank2=zeros(m2,1);
%%
sum11=0;
for i=0:4
    %a4=sum(i,1);
    switch i
        case 0
            a1=0;
        case 1
            a1=3;
        case 2
            a1=5;
        case 3
            a1=6;
        case 4
            a1=7;
    end
    for j=1:4
        %b4=sum(j,2);
        switch j
            case 0
                b1=0;
            case 1
                b1=4;
            case 2
                b1=6;
            case 3
                b1=7;
            case 4
                b1=8;
        end
        
        for k=0:4
            %c4=sum(k,3);
            switch k
                case 0
                    c1=0;
                case 1
                    c1=2;
                case 2
                    c1=5;
                case 3
                    c1=9;
                case 4
                    c1=8;
            end
            if i+j+k==4
                sum11=a1+b1+c1;
                if blank<sum11
                    blank=sum11;
                    list=[i,j,k];
                end
            end
            
        end
    end
end
MAX=blank %最大获利
list %z最终结果
%%

sum12=0;
for i=0:5
    switch i
        case 0
            a1=0;
        case 1
            a1=3;
        case 2
            a1=5;
        case 3
            a1=6;
        case 4
            a1=7;
        case 5
            a1=6;
    end
    for j=0:5
        switch j
            case 0
                b1=0;
            case 1
                b1=4;
            case 2
                b1=6;
            case 3
                b1=7;
            case 4
                b1=8;
            case 5
                b1=9;
        end
        for k=0:5
            switch k
                case 0
                    c1=0;
                case 1
                    c1=2;
                case 2
                    c1=5;
                case 3
                    c1=9;
                case 4
                    c1=8;
                case 5
                    c1=8;
            end
            if i+j+k==5
                sum12=a1+b1+c1;
                if blank1<sum12
                    blank1=sum12;
                    list1=[i,j,k];
                end
            end
        end
    end
end
MAX1=blank1 %最大获利
list1 %z最终结果


背包问题