动态规划:背包问题

背包问题:有M个价值各不同的珠宝,小偷偷每个珠宝的时间也各不同,要在保安发现之前赶紧把珠宝尽可能多地装进背包,同时也必须保证背包内珠宝总价值最大

设:背包大小为M[][],t时刻偷窃珠宝的价值为V[100],每个珠宝偷窃的时间为time[t]

t时刻偷窃第i个珠宝,当前时间为t,则对当前珠宝进行判断,

设上次偷窃完背包内价值加上本次这个珠宝价值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