C语言 贪心算法求背包问题

[复制链接]
查看11 | 回复3 | 2010-11-29 10:01:57 | 显示全部楼层 |阅读模式
当货物总重量∑Wi小于或等于M时,把所有货物装入,总价值就达到最大。因此,关键是解决当总重量大于M时装货的方法。
我们先从一个具体例子入手来研究一下本题的特点。

设n=3;M=20。

W1=15W2=10W3=8

P1=18P2=15P3=10
下面是我写的一个程序,不过好像有点问题,正确的结果应该是输出X1=2,X2=10,X3=8
但是输出的是:X1=10,X2=8,X3=2.
#include
#include
#define N 50
float find(float p[N],float w[N],float x[N] ,float M,int n) /*先放单位价值量大的物体,再考虑小的物体*/
{

int i;

float maxprice;

for (i = 0; i0)

{

maxprice=maxprice+p*x/w;

i++;

}

return maxprice;
}
int main()
{

int n,flag=1;

float temp,M,w[N],p[N],x[N];

int k;

printf("输入物品种数:\n");

scanf("%d",&n);

printf("输入背包重量:\n");

scanf("%f",&M);

printf("输入%d个物品的重量:\n",n);

for(k=0;k #include #define N 50float find(float p[N],float w[N],float x[N] ,float
回复

使用道具 举报

千问 | 2010-11-29 10:01:57 | 显示全部楼层
分数太少了,第一个是动态规划,第二个是贪心,都挺简单的还是给你写吧第一题:#include#includeint a[2000],b[200000],n,m,i,j;int main(){ scanf("%d",&n);//钱币种类 for (i=0;i#includeint a[2000],b[200000],n,m,i,j;int main(){ scanf("%d",&n);//钱币种类 for (i=0;i<
回复

使用道具 举报

千问 | 2010-11-29 10:01:57 | 显示全部楼层
答案是正确的 程序没有出错 是因为你的控制语句写错了 背包问题讲的是不能超过背包的总重量三种物品的单位价值分别为1.2、1.5、1.25挑选时先选1.5、1.25、1.2重量分别为 108最后才是2建议你最好用一个数组对货物进行编号这样分析时容易点 并且输出时清晰一点
回复

使用道具 举报

千问 | 2010-11-29 10:01:57 | 显示全部楼层
你的冒泡排序貌似不对,你自己看一下排序后价值数组的数据看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行