動的プログラミング: ナップザック問題

バックパックの問題: 価値の異なる宝石が M 個あり、それぞれの宝石を盗む時間も異なります。警備員に見つかる前にできるだけ多くの宝石をバックパックに入れる必要があり、同時に、バックパック内の宝石の合計価値が最大であることを確認する必要があります

バックパックのサイズを M[][]、時刻 t で盗まれた宝石の価値を V[100]、盗まれた各宝石の時間を time[t] とします。

時刻t、現在時刻tにi番目の宝石を盗み、現在の宝石を判定し、

最後の盗難後のバックパックの値にこの宝石の値 v[i] を加えたものを m[i-1][ t-time[i] ] とします。

宝石が盗まれていない場合: m[i-1][t]

状態遷移方程式: M[i] [j]= max{ v[i]+m[i-1][j-time[i] , m[i-1][t]}

#include<stdio.h>

int TotalTime, num;    //设置总时间和珠宝数量
int value[100],time[100],m[1000][1000];
int main(){
    printf("输入总时间和珠宝数量\n")
    scanf("%d,%d",&TotalTime,&num);
    printf("输入每个珠宝的时间和珠宝价值\n")
    for(int i = 0; i<num; i++){
        scanf("%d,%d",&time[i],&value[i]);
        printf("\n");
    }
    for(int i = 0; i<num; i++){
        for(int t=TotalTime;t>0;t--){    //剩余时间
            if(time[t]<t){    //当前珠宝偷窃时间足够
                int value1 = m[i-1][t-time[t]+v[i];
                int value2 = m[i-1][t];    //如果不采集,时间不变
                m[i][t] = (value1>value2 : value1?value2);
            }
        }        
    }
    printf("偷窃总价值为:%d",m[num][TotalTime]);
    return 0;
}

おすすめ

転載: blog.csdn.net/qq_37504771/article/details/124003621