欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

背包问题I--最大字段和

发布时间:2025/6/15 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 背包问题I--最大字段和 小编觉得挺不错的,现在分享给大家,帮大家做个参考.


背包问题I
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述

    有一个背包容积为 V 和 n 个物品,并给出每个物品有一个体积。要求从 n 个物品中,任取若干个装入背包内,使背包的剩余空间为最小。

输入
第一行两个正整数 V 和 n,分别表示背包的容积和待装物品的个数;第二行包括 n 个正整数,表示 n 个物品的体积,两两之间有一个空格分隔。
输出
一个数,表示背包中剩余空间的最小值
输入示例
24 6
8 3 12 7 9 7
输出示例
0
其他说明
数据范围:0<V≤20000,0<n≤30




//============================================================================ // Name : maxsum.cpp // Author : judyge // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================/*** 动态规划:计算最大子段和* 算法描述:* 数组a 有n个元素, 记 s[i] 为从a【0】到a[i]中,包含a[i]的最大子段和* 则: s[i] 的值为: s[i-1]>0时, s[i-1]+a[i]* 否则 a[i]*/ #include <stdio.h> #include <stdlib.h> #include <iostream> #include<algorithm> using namespace std;static int maxn[100]; //中间最大值保存在数组 static int j=0;int maxSub(int *a, int n,int v) {int i=0, max=0, max_pos = 0;int si_1=0, si = 0;//分别记录s[i-1], 和 s[i]的值int *p = (int *)malloc(n*sizeof(int)); //p[i] 助于记录哪些单元被选择, p[i]=1 表示s[i]计算的结果中中使用了s[i-1]的值if (p==NULL)return -1;max = si_1 = a[0];p[0] = 0;for (i=1; i<n; i++){if (si_1<0){p[i] = 0;si = a[i];} else{p[i] = 1;si = si_1+a[i];}si_1 = si;if (si>max&&si<=v){ //小于等于背包V的保存在数组max = si;max_pos = i;maxn[j++]=max;}}//找到最大子段和的位置for (i=max_pos; i>=0; i--)if (p[i]==0)break;//即i..max_pos为最大子段和的元素printf("%d--%d:%d\n", i, max_pos, max);free(p);p = NULL;return max; }int main() {int n;int v;cin>>v>>n;int a[n];for(int i=0;i<n;i++){cin>>a[i];}maxSub(a,n,v);sort(a,a+j); //排列cout<<a[j]; //输出最大的 V的剩余最小return 0; }

总结

以上是生活随笔为你收集整理的背包问题I--最大字段和的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。