输入样式:
1 2 1 3 5 4 3 6 2 4 3
输出样式:
20
我提交的代码:
#include<stdio.h>
int a[5],i,j,k,sum=0,t=0,work[21],dp[2501];
int max(int x,int y){//找出最大时间
if(x>y){
return x;
}
else{
return y;
}
}
int main(){
for(i=1;i<=4;i++)
scanf("%d",&a[i]);//输入四个正整数 s1,s2,s3,s4
for(i=1;i<=4;i++){//循环四次,得到四门科目最小时间t
sum=0;//每科目的时间总和sum初始化为0
for(j=1;j<=a[i];j++){
scanf("%d",&work[j]);//输入本门科目每道题所用时间
sum+=work[j];//总时间累加
}
for(j=1;j<=a[i];j++){
for(k=sum/2;k>=work[j];k--){
//k<homework[j],也就是左脑的时间容量小于这道题所需要的时间,即时间装不下
dp[k]=max(dp[k],dp[k-work[j]]+work[j]);
}//k代表左脑容量(时间),dp[k]代表左脑解题所能装的最大时间
}//homework[j]代表每门科目(i)每道题(j)所花的时间
//dp[k-homework[j]]代表选择完成这门科目(i)道题目(j)的最大时间
/*max()在选择完成这道题目和选择不完成这道题目的两种状态之中,选择花费时间最大的,也就是背包中价值最大的*/
t=t+sum-dp[sum/2];//左脑花费的最大时间,累加为右脑
for(j=1;j<=sum/2;j++){
dp[j]=0;//每一次都要将左脑清零
}
}
printf("%d",t);//输出右脑,即为最短时间
return 0;
}
作为自己的第一个背包题目,好好记录一下