c语言背包问题求找零钱问题和背包贪心算法问题(背包里物体可分解)C语言程序

c语言背包问题  时间:2021-07-03  阅读:()

编程序解决0 1 背包问题?(c语言)

for (int i=1;i<=n;i++) for (int j=0;j<=v;j++) if (j<w[i]) f[i][j]=f[i-1][j]; else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i]);//w为重量,c为价值,n为物品个数,v为背包容量 printf ("%d",f[n][v]);

用C语言编写动态规划解决0-1背包问题,如何实现从.txt文件中读取数据

?程序要求 ?动态规划的过程必须通过DProcessing( wi , vi , m[i,j] ) 计算 ?wi表示物品 i的重量, ?vi 代表物品 i的价值, ?m[ i,j ] 代表当前正在规划的重量为 j 的背包 的价值 ?注:动态规划的过程禁止直接写在主函数中!

背包问题

容量为多少啊,楼主 本程序以背包容量为5为例(用C语言编写): #define N 4 /*物品个数*/ #define W 5/*背包容量*/ #include <stdio.h> /******************************************************************* *************以下为动态规划算法解0-1背包问题****************/ int min(int a,int b) { return (a<b) ? a : b; } float max(float a,float b) { return (a>b) ? a : b; } void Knap(float*v,int *w,int c,float m[N+1][W+1]) { int i,j; int jMax=min(w[N]-1,c); for(j=0;j<=jMax;j++) m[N][j]=0; for(j=w[N];j<=c;j++) m[N][j]=v[N]; for(i=N-1;i>1;i--) { jMax=min(w[i]-1,c); for(j=0;j<=jMax;j++) m[i][j]=m[i+1][j]; for(j=w[i];j<=c;j++) m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]); } m[1][c]=m[2][c]; if(c>=w[1]) m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]); } void Traceback(float m[N+1][W+1],int *w,int c,int *x) { int i; for(i=1;i<N;i++) if(m[i][c]==m[i+1][c]) x[i]=0; else {x[i]=1; c-=w[i];} x[N]=( (m[N][c]) ? 1 : 0 ); } void Knapsack_1(float*v,int *w,int c,float m[N+1][W+1],int *x) { Knap(v,w, c,m); Traceback(m,w,c,x); } /******************************************************************* *****************以下为贪心算法解背包问题*********************/ void sort(float *v,float *w) { int i,j; float temp; for(i=1;i<N;i++) for(j=i+1;j<=N;j++) if(v[i]/w[i]<v[j]/w[j]) { temp=v[i]; v[i]=v[j]; v[j]=temp; temp=w[i]; w[i]=w[j]; w[j]=temp; } } void Knapsack_2(float c,float *v,float *w,float *y) { int i; sort(v,w); for(i=1;i<=N;i++) y[i]=0; for(i=1;i<=N;i++) { if(w[i]>c) break; y[i]=1; c-=w[i]; } if(i<=N) y[i]=c/w[i]; } /******************************************************************* *************************以下为主函数***************************/ main() { float m[N+1][W+1] , v[N+1]={N,1,2,2,1} , w_2[N+1]={N,2,1,2,3} , c_2=W;/*v[]存储价值,w[]存储质量,c为背包容量*/ int w_1[N+1]={N,2,1,2,3},c_1=W; float y[N+1]; int x[N+1]; int i,j; float vSum=0,wSum=0; Knapsack_1(v,w_1,c_1,m,x); printf("利用线性规划算法后,背包中的物品价值和质量为: "); j=0; for(i=1;i<=N;i++) if(x[i]) { printf("物品%d的价值为%g、质量为%d ",++j,v[i],w_1[i]); vSum+=v[i]; wSum+=w_1[i]; } printf("背包中总价值为%g、总质量为%g、背包剩余容量为%g ",vSum,wSum,c_1-wSum); Knapsack_2(c_2,v,w_2,y); vSum=wSum=0; j=0; printf(" 利用贪心算法后,背包中的物品价值和质量为: "); for(i=1;i<=N;i++) if(y[i]) { printf("物品%d的价值为%g、质量为%g ",++j,v[i]*y[i],w_2[i]*y[i]); vSum+=v[i]*y[i]; wSum+=w_2[i]*y[i]; } printf("背包中总价值为%g、总质量为%g、背包剩余容量为%g ",vSum,wSum,c_2-wSum); printf(" 注:两个算法得出的结果不一定相同,这是正常的。

"); }

求计算背包问题总方案数的C语言程序或者思路啊!!!!!

#include<stdio.h> #define N 100 int str[N]; int w[N]; int k=0; void backtrack(int i,int n,int m) { if(m==0){ k++; for(int i=1;i<=n;i++) if(str[i]!=i) printf("%d ",i); printf(" "); } if(i<=n&&m>0){ for(int j=0;j*w[i]<=m;j++){ if(j!=0)str[i]=0; backtrack(i+1,n,m-j*w[i]); str[i]=i; } } } int main() { int m,n; printf("请输入背包的容积: "); scanf("%d",&m); printf("请输入物品的种类数: "); scanf("%d",&n); for(int i=1;i<=n;i++) str[i]=i; for(i=1;i<=n;i++){ printf("请输入第%d种物品的体积: ",i); scanf("%d",&w[i]); } printf("背包中存放的物品的几种情况分别为为: ");//注意输出结果有的相同,但他们的数目不同 backtrack(1,n,m); printf("总方案数为:%d ",k); return 0; }

C语言的背包问题

1 在代码风格上不要把 for 循环以外的东西放到 for 语句内部, 2 i++ 建议使用++i 3 代码逻辑 除了 max 最清晰 其他的基本一眼 看不懂你想干嘛,你是写给你自己看的,就不要贴到网上让别人看了.

求找零钱问题和背包贪心算法问题(背包里物体可分解)C语言程序

分数太少了,第一个是动态规划,第二个是贪心,都挺简单的 还是给你写吧 第一题: #include<stdio.h> #include<memory.h> int a[2000],b[200000],n,m,i,j; int main() { scanf("%d",&n);//钱币种类 for (i=0;i<n;i++) scanf("%d",&a[i]);//每个钱币的面值 scanf("%d",&m);//需要计算的钱币的面值 memset(b,0,sizeof(b)); for (i=0;i<n;i++) b[a[i]]=1; for (i=1;i<=m;i++) for (j=0;j<n;j++) if (i-a[j]>0) if (b[i]==0) { if (b[i-a[j]]!=0) b[i]=b[i-a[j]]+1; } else { if (b[i-a[j]]!=0&&b[i-a[j]]+1<b[i]) b[i]=b[i-a[j]]+1; } if (b[m]==0) printf("-1 ");//找不开输出-1 else printf("%d ",b[m]);//可以找到交换策略,输出最小票数 return 0; } 第二题: #include<iostream> #include<algorithm> using namespace std; struct good//表示物品的结构体 { double p;//价值 double w;//重量 double r;//价值与重量的比 }a[2000]; double s,value,m; int i,n; bool bigger(good a,good b) { return a.r>b.r; } int main() { scanf("%d",&n);//物品个数 for (i=0;i<n;i++) { scanf("%lf%lf",&a[i].w,&a[i].p); a[i].r=a[i].p/a[i].w; } sort(a,a+n,bigger);//调用sort排序函数,你大概不介意吧,按照价值与重量比排序贪心 scanf("%lf",&m);//读入包的容量m s=0;//包内现存货品的重量 value=0;//包内现存货品总价值 for (i=0;i<n&&s+a[i].w<=m;i++) { value+=a[i].p; s+=a[i].w; } printf("The total value in the bag is %.2lf. ",value);//输出结果 return 0; }

华纳云,3折低至优惠云服务器,独立服务器/高防御服务器低至6折,免备案香港云服务器CN2 GIA三网直连线路月付18元起,10Mbps带宽不限流量

近日华纳云发布了最新的618返场优惠活动,主要针对旗下的免备案香港云服务器、香港独立服务器、香港高防御服务器等产品,月付6折优惠起,高防御服务器可提供20G DDOS防御,采用E5处理器V4CPU性能,10Mbps独享CN2 GIA高速优质带宽,有需要免备案香港服务器、香港云服务器、香港独立服务器、香港高防御服务器、香港物理服务器的朋友可以尝试一下。华纳云好不好?华纳云怎么样?华纳云服务器怎么样?...

妮妮云(43元/月 ) 香港 8核8G 43元/月 美国 8核8G

妮妮云的来历妮妮云是 789 陈总 张总 三方共同投资建立的网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑妮妮云的市场定位妮妮云主要代理市场稳定速度的云服务器产品,避免新手购买云服务器的时候众多商家不知道如何选择,妮妮云就帮你选择好了产品,无需承担购买风险,不用担心出现被跑路 被诈骗的情况。妮妮云的售后保证妮妮云退款 通过于合作商的友好协商,云服务器提供2天内全额退款,超过2天不退款 物...

盘点618年中大促中这款云服务器/VPS主机相对值得选择

昨天有在"盘点2021年主流云服务器商家618年中大促活动"文章中整理到当前年中大促618活动期间的一些国内国外的云服务商的促销活动,相对来说每年年中和年末的活动力度还是蛮大的,唯独就是活动太过于密集,而且商家比较多,导致我们很多新人不懂如何选择,当然对于我们这些老油条还是会选择的,估计没有比我们更聪明的进行薅爆款新人活动。有网友提到,是否可以整理一篇当前的这些活动商家中的促销产品。哪些商家哪款产...

c语言背包问题为你推荐
混淆矩阵两个矩阵相似可以得出什么row函数Excel row函数如何带入其他函数内?开票系统怎样开普通发票系统附清单qq号查询怎样查找本地qq号码索引超出了数组界限索引超出了数组界限是怎么回事啊?spawningVC中Error spawning cl.exe错误的解决方法.radius认证如何写一个C#的Radius认证客户端民生电商民生电商是民生银行吗?pci数据捕获和信号处理控制器大侠们,PCI数据捕获和信号处理控制器不能正常工作了要怎么解决啊,是不是要安装主板驱动啊?优众网瑞达恒慧讯网是做什么的?
台湾主机 免费ftp站点 最好的空间 hkg 腾讯实名认证中心 shopex主机 优酷黄金会员账号共享 wordpress中文主题 免费个人网页 江苏双线 windowsserver2008 ncp是什么 优惠服务器 cloudflare 9929 衡天主机 suspended翻译 上海服务器托管 护卫神主机管理系统 华为4核手机 更多