背包问题:有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;
}