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

1 篇文章 0 订阅
最近在刷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];

数组的最后一位永远是最大值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值