生活随笔
收集整理的這篇文章主要介紹了
背包问题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--最大字段和的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。