解题思路:

注意事项:解疑!!!!

参考代码:


01背包算法的二维数组求解具体代码如下:


#include <stdio.h>

int Max(int a,int b)

{

    if(a>b)

        return a;

    else

        return b;

}

int main()

{

    int f[26][10000]={0};

    int v[26]={0};

    int w[26]={0};

int N,m;

scanf("%d%d",&N,&m);

for(int i=1;i<=m;i++)

scanf("%d %d",&v[i],&w[i]);

int i,j;

for(i=1;i<=m;i++)

{

for(j=1;j<=N;j++)

{

if(v[i]>j){

f[i][j]=f[i-1][j];

}

else

{

f[i][j]=Max(f[i-1][j],f[i-1][j-v[i]]+(v[i]*w[i]));

}

}

}

printf("%d\n",f[m][N]);

return 0;

}


01背包算法的一维数组求解具体代码如下:


#include <stdio.h>

int Max(int a,int b)

{

    if(a>b)

        return a;

    else

        return b;

}

int main()

{

    int bp[10000]={0};//初始化bp

    //注意:定义数组bp内的值的个数应尽可能的大,否则会出现错误

    int v[100],p[100];//v表示该物品的价格(v<=10000),p表示该物品的重要度(1~5)

int N,m;//N(<30000)表示总钱数,m(<25)为希望购买物品的个数。

scanf("%d %d",&N,&m);

for(int i=1;i<=m;i++)

scanf("%d%d",&v[i],&p[i]);

int i,j;

//01背包算法,优化后的一维数组

for(i=0;i<=m;i++)

{

for(j=N;j>=v[i];j--)

{

bp[j]=Max(bp[j],bp[j-v[i]]+(v[i]*p[i]));

}

}

printf("%d\n",bp[N]);

return 0;

}

如果把01背包算法部分用函数表示,提交是正确的,但是,我不懂为什么放在主函数里面就有错误了。(刚学习的01算法可能存在我没有发现的错误)

在线编辑的时候,运行正确,可是代码提交说是运行错误,各位大佬帮忙看看具体是什么问题,谢谢!

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论