0-1背包

  1. 问题
    已知有一个最多可以装质量W的背包,还有N件物品,第i件物品的质量是w[ i ],价值是v[ i ],每种物品尽可以放一件,可以选者放或者不放,而且不可以超过背包的最大承受的重量

  2. 解析
    假设一个A机器,一个B机器,有n个任务(n>=2),处理每个任务需要的时间为ai,按任务顺序,当A机器用j时间和B机器共处理了k个任务(0<=j<=a的和,2<=k<=n),那么有一函数F(k,j)可求出此时B机器用的最少时间。
    当k=1,j<a[1]时,F(k,j)应为a[1];
    当k=1,j>=a[1]时,F(k,j)应为0;
    当k>1,j<a[k]时,A机器没时间处理该任务,则由B机器处理,即F(k,j)=F(k-1,j)+a[k];
    当k>1,j>=a[k]时,A机器有时间处理该任务,但要和B机器处理的时间取最小值,因为完成k-1个任务时,A机器花费了j-a[k]的时长,因此F(k,j)=min{F(k-1,j)+a[k],F(k-1,j-a[k])。
    在这里插入图片描述

当所有任务都完成,即k==n时,可求出最短时间:
对于每一个确定的F(k,j)应取F(k,j)和j的最大值,即max{j,F(k,j)},因为要取最晚结束的时间;在此基础上应取所有值的最小值为最短时间。

  1. 设计
    for(int i = 1; i <= N; i++){
    for(int j = 1; j <= W; j++){
    if(j < w[i]) dp[i][j] = dp[i - 1][j]; //不装,因为装不下
    //在可以装得前提下, 看看装还是不装哪一种情况可以使得价值更大;
    else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
    }
    }
    4.分析
    时间复杂度为O(n^2)
    5.源码

https://github.com/woshichunchongchong/Algorithm_hw/blob/main/0-1%E8%83%8C%E5%8C%85.cpp

#include
#include
#include<string.h>
#include<limits.h>
#include
#define MAX_SIZE 500
using namespace std;

int max(int x, int y); //求最大值
int min(int x, int y); //求最小值
int solve(int a[], int n); //求最短时间

int main(){
int n; //任务数量
int a[MAX_SIZE]; //完成每项任务需要的时间
int ans; //最短时间
cout << “请输入任务总数:”;
cin >> n;
cout << “请输入完成每项任务需要的时间(用空格分开):”;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
ans = solve(a, n);
cout << “两台机器完成全部任务的最短时间为:” << ans << endl;
return 0;
}

int max(int x, int y) {
if (x > y) {
return x;
}
else {
return y;
}
}

int min(int x, int y) {
if (x > y) {
return y;
}
else {
return x;
}
}

int solve(int a[], int n) {
int totle_time = 0; //所有任务共需时间
int dp[MAX_SIZE][MAX_SIZE]; //B机器所需的最短时间
int time[MAX_SIZE]; //最短时间
for (int i = 0; i < n; ++i) {
totle_time += a[i]; //计算所有任务共需时间
}

//当执行第1个任务时的情况 
for (int j = 0; j < totle_time + 1; ++j) {
	if (j < a[0]) {
		dp[0][j] = a[0];
	}
	else {
		dp[0][j] = 0;
	}
}

//当执行第2至最后一个任务时的情况 
for (int i = 1; i < n; ++i) {
	time[i] = INT_MAX;
	for (int j = 0; j < totle_time + 1; ++j) {
		if (j < a[i]) {
			dp[i][j] = dp[i - 1][j] + a[i];  //当执行的时间j小于A机器所需时间时,认为B机器执行第i+1个任务 

		}
		else {
			dp[i][j] = min(dp[i - 1][j] + a[i], dp[i - 1][j - a[i]]); //若B机器执行快,则选择在上一行的时间上加上第i+1个任务需要的时间,否则令A机器执行 
		}
		time[i] = min(time[i], max(j, dp[i][j]));
	}
}

// for (int i = 0; i < n; ++i) {
// for (int j = 0; j < totle_time + 1; ++j) {
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }

return time[n - 1];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值