本文主要是介绍0-1背包问题——小P寻宝记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
小P寻宝记
Time Limit: 1000MS Memory limit: 65536K
题目描述
输入
输出
示例输入
4 6 1 4 2 6 3 12 2 7
示例输出
23
提示
这是一个0—1背包问题,从头开始遍历所给数据,i代表第几个数据,k代表包的容积,只要k大于物品所需要的体积,就比较加上这个物品的价值和不加上这个物品的价值谁打,并取最大值,若不大于这个体积,则取之前的值落下来,将k变为二维数组,则k的取值表如下所示(此表和此题目无关,只是形式相似)
因此,利用逆序循环就可以保证在计算f[v]时,公式f[v]=max{f[v],f[v-c[i]]+w[i]}中等号右边的f[v]和f[v-c[i]]+w[i]保存的是f[i-1][v]和f[i -1][v-c[i]]的值。
- #include<stdio.h>
- #include<string.h>
- int maxa(int a,int b)
- {
- return a > b ? a : b;
- }
- int f[10009];
- int main()
- {
- int p[10009];
- int w[10009];
- int i,j,k,nn,vv;
- while(~scanf("%d%d",&nn,&vv))
- {
- memset (f,0,sizeof (f));
- for(i = 1; i<=nn; i++)
- {
- scanf("%d%d",&p[i],&w[i]);
- }
- for (i = 1; i <= nn; i++)
- for (k = vv; k >= 0; k--)
- {
- if (k >= p[i])
- f[k] = maxa (f[k],f[k - p[i]] + w[i]);
- else
- f[k] = f[k];
- }
- printf ("%d\n",f[vv]);
- }
- return 0;
- }
这篇关于0-1背包问题——小P寻宝记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!