您的位置:首页 > 其它

SDNU——1043.采药2(动态规划——完全背包)

2016-11-20 23:04 183 查看
sdnu的采药2,这个也是鼓捣了好几天,后来发现会手敲完全背包不会敲01了。。。找个时间再复习复习。

这个存板子吧,毕竟自己手打的,应该算比较合手的。

先贴代码

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int maxx(int a, int b)
{
if(a >= b)
return a;
else
return b;
}
int main()
{
int f[2][10000+5] = {0};
int weight[1000+5],value[1000+5];
int c = 1, d = 0, e;
int w, k, j;
int rongliang, zhongshu;
while(scanf("%d %d",&rongliang,&zhongshu) != EOF)
{
for(int q = 1; q <= zhongshu; q++)
{
scanf("%d %d",&weight[q],&value[q]);
}
//上面是先输入数据,包括每种药材的价值和重量
for(j = 1; j <= zhongshu; j++)
{
for(w = 1; w <= rongliang; w++)
f[c][w] = f[d][w];
for(k = 1; k <= rongliang; k++)//开始遍历 先从第一类开始,j、k都是1是因为输入数据的时候下标就是从1开始的
{
if(weight[j] <= k)//能装进去的话
f[c][k] = maxx(f[d][k],f[c][k-weight[j]]+value[j]);//状态转移方程
//printf("f[%d][%d] == %d\n",c,k,f[c][k]);//
}
e = c;
c = d;
d = e;
}
printf("%d\n",f[e][k-1]);
}

return 0;
}
这个里面比较出彩的地方在于



这里用了2,然后后面





每一行都继承上一行的数据,这样就不用开一个很大的数组了,有效节约内存空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: