剑指offer-拿红包

2016/05/24 C和C++基础

题目描述

圆桌边放了一圈红包形成一个环形,每个红包的金额不同,围绕圆桌走一圈选择若干红包,规则是不能拿相邻的红包,请问能拿到红包最多的总金额是多少?(红包金额保存在一个数组中,认为数组第一个元素和最后一个元素相邻,形成闭环)

输入包括多行:

第一行为整数N,0<N<20;

以下N行,每行为一个数组,每个元素为一个红包的金额,数值为0或100以内的整数,以逗号隔开,如是空行表明没有红包如:

2

1,2

1,3,4

输出包括N行,每行一个数字,为拿到红包的总金额,如:

2

4

思路:

2  4  5  1  2   8   9   4   3   vec
2  4  7  7  9  15   18  19  21   v
1  0  1  1  1   1   1   1   1    m
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int coutMoney(vector<int> vec){
	int len=vec.size();
	vector<int> v(len,0);    //记录最大值
	vector<int> m(len,0);    //记录有没有用到第一个红包
	if(len<=3){              //元素少于3个做特殊讨论
		return *max_element(vec.begin(),vec.end());
	}else{
		v[0]=vec[0];
		m[0]=1;
		v[1]=vec[1];
		m[1]=0;
		for(int i=2;i<len;i++){
			if(v[i-2]+vec[i]>v[i-1]){
				v[i]=v[i-2]+vec[i];
				m[i]=m[i-2];
			}else{
				v[i]=v[i-1];
				m[i]=m[i-1];
			}
		}
	}
	if(m[len-1]==1)
		return v[len-2];
	else
		return v[len-1];
}

int main(){
	//const int n=9;
	//int a[n]={2,4,5,1,2,8,9,4,3};
	//const int n=3;
	//int a[n]={2,4,5};
	const int n=6;
	int a[n]={2,3,4,1,2,4};
	vector<int> vec(a,a+n);
	cout<<coutMoney(vec)<<endl;
	system("pause");
}

Search

    Post Directory