记录第一个01背包问题——洛谷的p2392题

输入样式:

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;
}

作为自己的第一个背包题目,好好记录一下

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Is_Qinna

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值