背包问题
来源:互联网 发布:acca知乎 编辑:程序博客网 时间:2024/05/17 04:33
思想:
首先找到一个最大值进行比较,然后依次循环遍历:
void main(int argc, char* argv[])
{
int k,w,v;
printf("物品的中枢:");
scanf("%d",&n);
for(totv=0,k=0;k<n;k++)
{
printf("\n第%d种物品的质量和价值:",k+1);
scanf("%d%d",&w,&v);
a[k].weight=w;
a[k].value=v;
totv=totv+v;
}
printf("\n背包的总重量:");
scanf("%d",&limitw);
maxv=0;
for(k=0;k<n;k++)
{
cop[k]=0;
}
find(0,0,totv);
printf("\n最佳的方案为:");
for(k=0;k<n;k++)
{
if(option[k])
{
printf("\n第%d物品\n",k+1);
}
printf("\n总价值为%d",maxv);
}
}
这个main函数用于进行输入你的背包中的种类及各物品的价值和质量等信息。
通过main函数我们发现只写了一个查找最优化find()函数!
给totv进行了一个赋值操作,就是输入的背包种类的总重量。
下面是find()函数的编写:
#include <stdio.h>
#define N 100
int limitw,totv,maxv;
int option[N],cop[N];
int n;
struct bag
{
int weight;
int value;
}a[N];
这里只是进行了一个声明,背包数组最大100个,因为我们在main函数中,及一些变量的声明!
void find(int i,int tw,int tv)
{
int k;
if(tw+a[i].weight<=limitw)
{
cop[i]=1;
if(i<n-1)
{
find(i+1,tw+a[i].weight,tw);
}
else
{
for(k=0;k<n;k++)
{
option[k]=cop[k];
maxv=tv;
}
cop[i]=0;
}
}//这个if条件作用是去寻找maxv的值。
if(tv-a[i].value>maxv)
{
if(i<n-1)
{
find(i+1,tw,tv-a[i].value);
}
else
{
for(k=0;k<n;k++)
{
option[k]=cop[k];
maxv=tv-a[i].value;
}
}
}
}
写到后面发现这代码有点问题,揣摩了几下,发现貌似只能是比背包总数量少一个的情况!大神可以指点下!
- 【无限背包】背包问题
- 背包问题---01背包
- 背包问题--部分背包
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- Hadoop JAR包运行时权限不够的问题
- 数据库认证技术概要
- Tomcat与Apache HTTP server 整合
- List.coffee
- Prim 最小生成树
- 背包问题
- nyoj27水池数目(基础搜索)
- 偷看别人的隐私?
- IIS6.0 支持json文件访问
- 养成这13个好的学习习惯,想不当学霸都难啊
- boost完全开发指南第2章-处理时间3(日期date)
- You can Solve a Geometry Problem too
- 桌面图标文字有蓝底怎么去掉
- HTML5画布与KineticJS删除事件侦听器的名字