1. 程式人生 > >開心的小明(華為入職前練習)

開心的小明(華為入職前練習)

小明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麼佈置,你說了算,只要不超過N元錢就行”。今天一早小明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的N元。

於是,他把每件物品規定了一個重要度,分為5等:用整數1~5表示,第5等最重要。他還從因特網上查到了每件物品的價格(都是整數元)。他希望在不超過N元(可以等於N元)的前提下,使每件物品的價格與重要度的乘積的總和最大。

設第j件物品的價格為v[j],重要度為w[j],共選中了k件物品,編號依次為j1j2,……,jk,則所求的總和為:

v[j1]*w[j1]+v[j2]*w[j2]+ +v[jk]*w[jk]。(其中*為乘號)

請你幫助小明設計一個滿足要求的購物單。

函式:void GetResult(int*p,int& Get_Result)
    
    輸入引數:int*p 指向二維陣列的首地址,該二維陣列第0行的兩個數分別表示:總錢數<30000,和希望購買物品的個數<25;該陣列從第1行到第m行(1<=j<=m)中給出了編號為j的物品的基本資料,每行有2個非負整數,表示該物品的價格(<=10000)和該物品的重要度(1~5)。<> 

 Get_Result表示不超過總錢數的物品的價格與重要度乘積的總和的最大值(<100000000)。<> 

輸出:無 

二維指標是不能操作這種二維陣列的,二維指標就是指標的指標,而這種情況應該用陣列指標,另外,由於二維自動陣列也是順序存放的,所以可以用一維指標傳遞二維陣列的地址,以下程式分別用陣列指標(fun()函式)和一維指標(fun2()函式)操作相同的操作:

//---------------------------------------------------------------------------

#include <stdio.h>

void fun(int (*p)[3]) /*或者void fun(int p[][3])*/
{
 p[0][2]=99978;
}
void fun2(int *p,int col) /*p指向
二維陣列
首元素的地址,col是二維數組的列數*/ { *(p+col*0+2)=99669;/*完成和fun()函式相同的操作,即將主函式中的a[0][2]元素設定為99669*/ } int main(void) { int a[2][3]={0}; fun(a); printf("%d\n",a[0][2]); fun2(&a[0][0],3); printf("%d",a[0][2]); return 0; } //---------------------------------------------------------------------------
#include "stdafx.h"
#include "iostream"
#include "string"
using namespace std;
  
/*
功能:

輸入引數:int*p 指向二維陣列的首地址,該二維陣列第0行的兩個數分別表示:總錢數<30000,和希望購買物品的個數<25;
          該陣列從第1行到第m行(1<=j<=m)中給出了編號為j的物品的基本資料,每行有2個非負整數,
		  表示該物品的價格(<=10000)和該物品的重要度(1~5)。

		  GetResult表示不超過總錢數的物品的價格與重要度乘積的總和的最大值(<100000000)。

		  不需做入參檢查,測試用例可以保證~
		  
    例如:4000 8(第0行)
		  821 3  (第1行)
		  422 5
		  458 5
		  500 3
		  200 2
		  430 4
		  530 3
		  239 3
		 
		  則表示 總錢數為4000,希望購買物品個數為8個,因此從第1行到第8行表示編號為j的物品的價格及物品的重要度。
	 	
          

	 		
返回值:無

溫馨提示:根據題意可知,該二維陣列只有兩列,且行數為第0行的第二個元素數值+1;入參p不能按照二維陣列的方法來取值,要將
          二維的轉換成一維的哦~

*/

void GetResult(int*p,int& Get_Result)
{	 
    int money=p[0],numMax=p[1],valueMax=0,temp,i,j;
	int f[30000]={0},v[100],w[100];
	for (i=2,j=1;i<2*numMax+1;i++,j++)
	{
		v[j]=p[i];
		i++;
		w[j]=p[i];
	}
	for(i=1;i<=numMax;i++)  
	{
		for(j=money;j>=v[i];j--)  
		{
			temp=f[j-v[i]]+v[i]*w[i];  
			if(temp>f[j])  
				f[j]=temp;  
		}  
	}
	Get_Result=f[money];
} 

int main()
{
	int p[6][2]={{1000,5},{800,2},{400,5},{300,5},{400,3},{200,2}};
	int get_result;
	GetResult(&p[0][0],get_result);
	cout<<get_result<<endl;
	return 0;
}