您的位置:首页 > 编程语言 > C语言/C++

01背包的c语言实现

2014-10-23 21:19 260 查看
01背包算是动态规划的入门项目了,网上的解释也是各种烂大街。题目基本是下面这种格式的:

01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。(来自百度百科)

恩,就是这样,第一眼看上去完全没有头绪,不过别害怕,这绝对不是你见到的第一个DP问题。生活中的每一个问题都有动态规划融入其中,你能活到现在,说明你有能力处理好这些问题。

现在我们来想一想,生活中如何解决这种问题。我们假设背包有W + 1个状态(0,1,2,...,W)。状态从0开始,每次放入新的物品背包的总价值都会增大,可放物体的体积都会缩小,到这里大家都应该没有问题吧。

然后我们再考虑“将前i件物品放入容量为v的背包中”这个子问题,如果只考虑放不放第i件物品,那么这个问题就可以转化为一个只牵扯前i-1件物品的问题:

如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[v];

如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c的背包中”,此时能获得的最大价值就是f[v-c]。

再加上通过放入第i件物品获得的价值 W[i],我们就可以从后向前地得出在前M件物品中取出若干件放进背包能获得的最大价值了。

下面是用C语言实现的代码:

#include <iostream>
using namespace std;

int main()
{
int V,N;
int i,j;
int c
;
int w
;
cin >> V >> N;

for(i = 1;i <= N;i++)
{
cin >> c[i] >> w[i];
}

int F[10010] = {};

for(i = 1;i <= N;i++)
{
for(j = V;j >= c[i];j--)
{
F[j] = max(F[j],F[j - c[i]] + w[i]);
}
}
cout << F[V];
return 0;
}

代码整体算是比较简洁的了,主要注意一下 F[ j ] = max( F[ j ] , F[ j - c[ i ] ] + w[ i ] )这个状态转移方程,一定要彻底明白方程的意思,刚开始的时候背下来也可以......

恩,差不多了,题目虽然简单,但重要的是思想,掌握好了基础的,才能继续前行嘛~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: