您的位置:首页 > 其它

关于动态规划0-1背包的算法

2017-07-14 20:29 225 查看
最近在刷OJ的时候发现有个高逼格的解决方法,特留下笔记:

题目如下:

输入参数: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的物品的价格及物品的重要度。

void GetResult(int*p,int& Get_Result)

{  

// 在这里实现功能

int money = p[0];

int num = p[1];

int value = 0;

int level = 0 ;

int i,j;

int count[30000]={0};

for(i = 1;i <= num;i++)

{

value = p[2*i];

level = p[2*i+1];

for(j = money; j>=value ;j--)

count[j] = (count[j-value] + value*level) > count[j] ? (count[j-value]+value*level) : count[j];
}

Get_Result = count[money];


数组的最后一位永远是最大值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: