背包问题-C语言代码
背包问题C编程

{
while(data[i][j] !=0)
{
data[i][9] += data[i][j];
j++;
}
j = 0;
}
for(i = 0;i<x;i++) //通过他们的和,求出和中符合条件的最大值
//这是采用的是递归
#include <stdio.h>
#include <string.h>
#define N 8 //物品个数
#define C 110 //背包容量
void fun(int,int,int,int); //穷举所有情况,采用的是递归
//背包问题:给定n种物品和一个背包,物品i的重量是wi, 背包的容量为C。如何选择装入背包的物品,使得背包中重量最大?
//例如:设有n=8个体积分别为54,45,43,29,23,21,14,1的物体和一个容积为C=110的背包(最优解:43+23+29+14+1=110)。
//程序输出为:43+23+29+14+1=110
{
for(j=i+1;j<N;j++)
{
for(k=0;k<sbx;k++)
{
data[x][y++] = b[k];
}
data[x][y] = a[j];
x++;
y = 0;
背包问题的三种解法代码实现

背包问题的三种解法实验报告实验要求:分别用动态规划法、回溯法、分支限界法解决0/1 背包问题,了解三种算法的算法步骤并上机实现。
实验步骤:1. 建立一个背包问题的解法类Bag.h。
bag_m为动态规划法,bag_b为回溯法,bag_t为分支限界法。
2. 建立一个排序类Sort1.h。
程序的需要对背包的价值比排序。
3. 由分支限界建立一个动态的最大堆及堆的各种操作和运算类SqList.h。
代码实现:1. 主函数:// 背包问题的解法#include <iostream> #include "Bag.h"// 背包问题处理方法类using namespace std;int main() int i,n,M;coutvv"请输入物品个数:";cin>>n;double *m=new double[n+1];double *p=new double[n+1];coutvv"输入每个物品的重量:";for(i=1;i<=n;i++)cin>>m[i];coutvv"输入每个物品的价值:for(i=1;i<=n;i++)cin>>p[i];coutvv"请输入背包的重量:";cin>>M;Bag bag;//创建一个背包问题的解法类对象coutvv"选择背包问题的解法,输入1,动态规划法,输入2,回溯法,输入3,分支限界法。
"vv'\n'vv"请输入1或者2,或者输入3:"<<"";cin>>i;if(i==1)bag.bag_m(m, p,n,M);//调用动态规划法if(i==2)bag.bag_b(m, p,n,M);// 调用回溯法if(i==3)bag.bag_t(m, p,n ,M);//调用分支限界法return 0;2. 排序方法类:(Filename:Sort1.h)// 合并排序类(合并排序)#include <iostream>using namespace std;struct objdouble m;double p;double v;};typedef struct obj OBJ; // 定义物体的数据结构class Sort1public:void merge_sort(OBJ a[],int n)// 以物体的价值比排序int i,s,t=1;while(t<n)s=t;t=2*s;i=0;while(i+t<n)merge(a,i,i+s-1,i+t-1,t);i=i+t;if(i+s<n)merge(a,i,i+s-1,n-1,n-i);void merge(OBJ a[],int p,int q,int r,int n)OBJ *bp=new OBJ[n];int i,j,k;i=p;j=q+1;k=0;while(i<=q&&j<=r)if(a[i].v<=a[j].v)bp[k++]=a[i++];elsebp[k++]=a[j++];if(i==q+1)for(;j<=r;j++)bp[k++]=a[j];elsefor(;i<=q;i++)bp[k++]=a[i];k=0;for(i=p;i<=r;i++)a[i]=bp[k++];delete bp;};3. 背包问题解法类:(Filename:Bag.h)// 背包问题方法类(包含三种方法)//bag_m 动态规划法//bag_b 回溯法//bag_t 分支限界法#include <iostream>using namespace std;#include "Sort1.h"#include "SqList.h"class Bagpublic:void bag_m(double *m,double *p,int n,int M)// 动态规划法int i,j;int *x=new int[n+1];OBJ *objs=new OBJ[n+1];objs[0].p=0;objs[0].v=0;for(i=1;i<=n;i++)objs[i].m=m[i];objs[i].p=p[i];objs[i].v=objs[i].m/objs[i].p;double **optp;optp=new double *[n+1]; for(i=0;i<n+1;i++)optp[i]=new double[M+1]; x[i]=0;for(i=0;i<=n;i++)optp[i][0]=0;for(i=0;i<=M;i++)optp[0][i]=0;for(i=1;i<=n;i++)for(j=1;j<=M;j++)optp[i][j]=optp[i-1][j];elseoptp[i][j]=optp[i-1][j];if(optp[i][j]<(optp[i-1][int(j-objs[i].m)]+objs[i].p)) optp[i][j]=(optp[i-1][int(j-objs[i].m)]+objs[i].p);i=n;j=M;while(i&&j)if(optp[i][j]>optp[i-1][j])x[i]=1;j-=objs[i].m;elsex[i]=0;cout<<" 输出结果,装入为1,不装入为0:"<<'\n'; for(i=1;i<=n;i++)cout<<x[i]<<" ";}cout<<'\n';coutvv"背包物体的总价值最大为:"VVO ptp[n ][M]VV'\n:delete x,objs;for(i=0;i<=n;i++)delete [] optp[i];delete optp;void bag_b(double *m,double *p,int n,int M)// 回溯法int i,j,k;int *x=new int[n+1];int *y=new int[n+2];double m_cur,m_est,p_cur,p_est,p_total;m_cur=0;p_cur=0;p_total=0;OBJ *objs=new OBJ[n+1];objs[0].m=0;objs[0].p=0;objs[0].v=0;for(i=1;i<=n;i++)objs[i].m=m[i];objs[i].p=p[i];objs[i].v=objs[i].m/objs[i].p;y[i]=0;x[i]=0;y[n+1]=0;Sort1 sort;sort.merge_sort(objs,n+1);// 排序k=1;while(k>=1)p_est=p_cur;m_est=m_cur;for(i=k;i<=n;i++)m_est=m_est+objs[i].m;if(m_est<M)p_est=p_est+objs[i].p;elsep_est=p_est+((M-m_est+objs[i].m)/objs[i].m)*objs[i].p;break; if(p_est>p_total)for(i=k;i<=n;i++)if(m_cur+objs[i].m<=M) m_cur+=objs[i].m;p_cur+=objs[i].p;y[i]=1;else {y[i]=0; break;}if(i>=n)if(p_cur>p_total)p_total=p_cur;k=n+1; for(j=1;j<=n;j++)x[j]=y[j];else k=i+1;elsewhile(i>=1&&y[i]==0)if(i<1) break;elsem_cur-=objs[i].m;p_cur-=objs[i].p;y[i]=0;k=i+1;for(i=1;i<=n;i++)cout<<x[i];cout<<'\n';cout<<"total="<<p_total;delete x,y,objs;void bag_t(double *m,double *p,int n,int M)// 分支限界法int i;double t;OBJ *ob=new OBJ[n];for(i=0;i<n;i++)ob[i].m=m[i+1];ob[i].p=p[i+1];ob[i].v=ob[i].m/ob[i].p;Sort1 sort;sort.merge_sort(ob,n);Knapnode kn a,k nax,k nay;//定义左节点和右节点kna.b=0;kna.k=0;kna.p=0;kna.w=0;for(i=0;i<5;i++)kna.s1[i]=0;for(i=kna.k,t=kna.w;i<n;i++)if(t+ob[i].m<=M)t+=ob[i].m;kna.b+=ob[i].p;elsekna.b+=(M-t)*ob[i].p/ob[i].m;break;sqlist q;SqList sq;sq.InitList_Sq(q);sq.insert(q,kna);while(q.length!=0)kna=sq.delete_max(q);if(kna.k==5)}}cout<<"the value is:"<<kna.p<<'\n'; for(i=0;i<5;i++)cout<<kna.s1[i]<<" ";cout<<'\n';break;knay=kna;knay.k++;knay.b=knay.p;for(i=knay.k,t=knay.w;i<n;i++)if(t+ob[i].m<=M)t+=ob[i].m;knay.b+=ob[i].p;elseknay.b+=(M-t)*ob[i].p/ob[i].m;break;sq.insert(q,knay);knax=kna;if(knax.w+ob[knax.k].m>M)continue;knax.s1[knax.k]=1;knax.w+=ob[knax.k].m;knax.p+=ob[knax.k].p;knax.k++;sq.insert(q,knax);};4.动态堆方法类(分支限界方法中用到,Filename:SqList.h)// 动态最大堆#include <iostream>#include "math.h"#include <iomanip>using namespace std;#define ListInitSize 20#define ListIncrement 10const n=5;typedef structint s1[n];int k;float b;float w;float p;}Knapnode;typedef struct sqListKnapnode *elem;int length;int listsize;}sqlist;class SqList/动态堆类public:void InitList_Sq(sqlist &L)//n 为单位元素的大小,初始化堆L.elem=(Knapnode *)malloc(ListInitSize* sizeof(Knapnode));if(L.elem==NULL) exit(OVERFLOW);L.length=0;L.listsize=ListInitSize;void ListI nsert_Sq(sqlist & L,K napn ode elem)/向堆中插入节点Knapnode * newbase;if(L.length>=L.listsize)newbase=(Knapnode*)realloc(L.elem,(L.listsize+ListIncrement)sizeof(Knapnod e))if(newbase==NULL) exit(OVERFLOW);L.elem=newbase;L.listsize+=ListIncrement;L.elem[++L.length]=elem;void sift_up(sqlist &L,int i)// 上移操作while(i>=2)*if(L.elem[i].b>L.elem[i/2].b)swap(L.elem[i/2],L.elem[i]);i/=2;else break;void sift_down(sqlist &L,int i)// 下移操作int done=0;i=2*i;while(done==0&&i<=L.length)if(i+1<=L.length&&L.elem[i+1].b>L.elem[i].b) i++;if(L.elem[i/2].b<L.elem[i].b)swap(L.elem[i/2],L.elem[i]);else done=1;void swap(Knapnode &a,Knapnode &b)Knapnode t;t=a;a=b;b=t;void in sert(sqlist & L,Kna pn ode x)//插入节点后,并排序ListInsert_Sq(L,x);sift_up(L,L.length);Kna pn ode delete_max(sqlist & L)//删除堆中预测价值的最大者Knapnode p;p=L.elem[1];swap(L.elem[1],L.elem[L.length]);L.length--;sift_down(L,1);return p;void print(sqlist &L)// 打印堆的数据int i;};for(i=1;i<=L.length;i++)cout<<L.elem[i].b;运行方法和结果(用这三种算法分别给出实验结果):1. 动态规划法:2. 回溯法:3. 分支限界法。
C#背包问题 子集和问题 暴力算法

C-SHARP 编程求解背包问题源代码//前面用EXCEL解决的背包问题,下面用C#语言来模仿EXCEL的解决思路求解背包问题//本程序没有对用户输入的合法性进行的检测,有待改进。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace backbag{class Program{static void Main(string[] args){Console.WriteLine("");Console.WriteLine("-------------------欢迎使用背包问题计算器-------------------");Console.WriteLine(" ");Console.WriteLine("****************************************** ******************");Console.WriteLine("** 本程序的用途:在一组数据中,有不定个数的数据之和为 **");Console.WriteLine("** 一个特定的值,本程序可以求出该数据组所有的排列组合方式 **");Console.WriteLine("** 注意:本程序由于算法和数据类型限制,最多只能处理32 **");Console.WriteLine("** 个数据。
**");Console.WriteLine("****************************************** ******************");Console.WriteLine(" ");Console.WriteLine("》编程语言:C-SHARP 》程序类型:控制台程序》作者:陈东昇");Console.WriteLine("》开发工具:VS2008 》开发时间:2016-01-01 》版本号:V1.0");Console.WriteLine("------------------------------------------------------------");Console.WriteLine(" ");/* 以上代码,显示程序基本信息*/int totalLength=0;Console.Write("请输入数据个数(1~32之间):");for (int i = 0;i<1 ; ){totalLength =Convert.ToInt32(Console.ReadLine()); //用户输入一个数字,将totalLength用来存储数组的长度;if (totalLength > 32 ){i=0;Console.Write("数字太大,请重新输入(1~32之间):");}else if (totalLength < 1){i = 0;Console.Write("数字太小,请重新输入(1~32之间):");}else if (totalLength <= 32 || totalLength >= 1){i = 1;}}Console.WriteLine();double[] theData = newdouble[totalLength]; //theData用来存储要处理的数据;double[] resule = newdouble[totalLength]; //用来保存最终的数组结果uint maxTime =0; //用maxTime来保存所有排列组合的个数;stringrunTime; //用 runTime 来保存maxTime的二进制字符串。
动态规划------背包问题(c语言)

动态规划------背包问题(c语⾔)/*背包问题:背包所能容纳重量为10;共五件商品,商品重量⽤数组m存储m[5]={2,2,6,5,4},每件商品的价值⽤数组n存储,n[5]={6,3,5,4,6};求背包所能装物品的最⼤价值。
*/#include<stdio.h>#include<conio.h>int main() {int m[5] = { 2,2,6,5,4 }, n[5] = { 6,3,5,4,6 };int flag[5] = { 0,0,0,0,0 };//符号标志位,表⽰地某个点是否装⼊背包,装⼊为1,未装⼊为0;int i, j, k;int c = 10, sum1 = 0, sum2 = 0;//sum1表⽰最终背包容纳的重量。
sum2表⽰最终背包中容纳的最⼤价值的价值。
//设⼀个⼆维数组,横坐标表⽰所装物品的标号,纵坐标表⽰背包所容纳的最⼤重量0~10;int mn[5][11];for (i = 4; i >= 0; i--) {//⼆维数组从下⾄上for (j = 0; j <= 10; j++) {if (i == 4) {if (m[i]>j)mn[i][j] = 0;elsemn[i][j] = n[i];}else {if (m[i]>j) {mn[i][j] = mn[i + 1][j];}else {mn[i][j] = mn[i + 1][j]>mn[i + 1][j - m[i]] + n[i] ? mn[i + 1][j] : mn[i + 1][j - m[i]] + n[i];}}}}for (i = 0; i<5; i++) {if (mn[i][c] != mn[i + 1][c]) {//从⼆维数组上⽅开始,背包最⼤值c,mn[i][c]的值若与mn[i+1][c]的值不同,则m[i]未放⼊背包中(之前是⾃下往上放的) flag[i] = 1;c = c - m[i];//若放⼊背包,则背包可容纳总重量减少;}printf("%d ", flag[i]);}//输出所放⼊的物品序号for (i = 0; i<5; i++) {if (flag[i] == 1) {sum1 += m[i];sum2 += n[i];}}printf("\n背包容纳的重量为:%d 背包容纳的总价值为:%d", sum1, sum2);getch();return0;}。
01背包问题c语言代码回溯法

以下是使用C语言实现01背包问题的回溯法代码:```c#include <stdio.h>#include <stdlib.h>// 初始化背包struct knapsack {int maxWeight; // 背包最大承重int *items; // 物品数组int n; // 物品数量};// 定义物品重量、价值和数量int weights[] = {2, 2, 6, 5, 4};int values[] = {6, 3, 5, 4, 6};int quantities[] = {3, 2, 2, 1, 1};// 初始化背包最大承重和当前承重int maxWeight = 10;int currentWeight = 0;// 初始化最大价值为0int maxValue = 0;// 遍历物品数组void traverseItems(struct knapsack *knapsack, int index) { // 对于每个物品,遍历其数量for (int i = 0; i < knapsack->quantities[index]; i++) {// 如果当前物品可以放入背包装且当前承重不超过背包最大承重,计算放入该物品后的总价值,并更新最大价值if (currentWeight + weights[index] <= knapsack->maxWeight) {int currentValue = values[index] * knapsack->quantities[index];if (currentValue > maxValue) {maxValue = currentValue;}}// 回溯,将当前物品从背包装中移除,递归地尝试下一个物品knapsack->quantities[index]--;if (index < knapsack->n - 1) {traverseItems(knapsack, index + 1);}knapsack->quantities[index]++; // 恢复物品数量,以便下次遍历尝试放入其他物品}}// 主函数int main() {// 初始化背包装和物品数组struct knapsack knapsack = {maxWeight, weights, 5};knapsack.items = (int *)malloc(sizeof(int) * knapsack.n);for (int i = 0; i < knapsack.n; i++) {knapsack.items[i] = values[i] * quantities[i]; // 根据价值和数量计算物品价值,并存储在物品数组中}knapsack.n = quantities[4]; // 由于最后一个物品的数量为1,因此只需遍历前n-1个物品即可得到所有可能的结果// 使用回溯法求解01背包问题,返回最大价值traverseItems(&knapsack, 0);printf("The maximum value is %d.\n", maxValue);free(knapsack.items); // 释放内存空间return 0;}```希望以上信息能帮助到你。
背包问题实验报告(C语言实现、文件输入及文件输出)

背包问题实验题目:背包问题问题描述:假设有一个能装入总体积为T的背包和n件体积分别为w1, w2, … , wn的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+ wn=T,要求找出所有满足上述条件的解。
例如:当T=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解:(1,4,3,2)(1,4,5)(8,2)(3,5,2)。
概要设计:采用栈数据结构,利用回溯法的设计思想来解决背包问题。
首先将物品排成一列,然后顺序选取物品装入背包,假设已选取了前i件物品之后背包还没有装满,则继续选取第i+1件物品,若该件物品“太大”不能装入,则弃之而继续选取下一件,直至背包装满为止。
但如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入背包的那件物品“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此重复,直至求得满足条件的解,或者无解。
ADT Stack {数据对象:D={ ai | ai∈ElemSet, i=1,2,...,n,n≥0 }数据关系:R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n }约定an端为栈顶,a1端为栈底。
基本操作:InitStack(&S)操作结果:构造一个空栈S。
DestroyStack(&S)初始条件:栈S已存在。
操作结果:栈S被销毁。
ClearStack(&S)初始条件:栈S已存在。
操作结果:将S清为空栈。
StackEmpty(S)初始条件:栈S已存在。
操作结果:若栈S为空栈,则返回TRUE,否则FALSE。
StackLength(S)初始条件:栈S已存在。
操作结果:返回S的元素个数,即栈的长度。
GetTop(S, &e)初始条件:栈S已存在且非空。
操作结果:用e返回S的栈顶元素。
Push(&S, e)初始条件:栈S已存在。
操作结果:插入元素e为新的栈顶元素。
背包问题

13.背包问题(Knapsack Problem)说明假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价解法背包问题是关于最佳化的问题,要解最佳化问题可以使用「动态规划」(Dynamicprogramming),从空集合开始,每增加一个元素就先求出该阶段的最佳解,直到所有的元素加入至集合中,最后得到的就是最佳解。
以背包问题为例,我们使用两个阵列value与item,value表示目前的最佳解所得之总价,item 表示最后一个放至背包的水果,假设有负重量1~8的背包8个,并对每个背包求其最佳解。
逐步将水果放入背包中,并求该阶段的最佳解:放入李子放入苹果放入橘子放入草莓放入甜瓜由最后一个表格,可以得知在背包负重8公斤时,最多可以装入9050元的水果,而最后一个装入的水果是3号,也就是草莓,装入了草莓,背包只能再放入7公斤(8-1)的水果,所以必须看背包负重7公斤时的最佳解,最后一个放入的是2号,也就是橘子,现在背包剩下负重量5公斤(7-2),所以看负重5公斤的最佳解,最后放入的是1号,也就是苹果,此时背包负重量剩下0公斤(5-5),无法再放入水果,所以求出最佳解为放入草莓、橘子与苹果,而总价为9050元。
实作C#include <stdio.h>#include <stdlib.h>#define LIMIT 8 // 重量限制#define N 5 // 物品种类#define MIN 1 // 最小重量struct body {char name[20];int size;int price;};typedefstruct body object;int main(void) {int item[LIMIT+1] = {0};int value[LIMIT+1] = {0};intnewvalue, i, s, p;object a[] = {{"李子", 4, 4500},{"苹果", 5, 5700},{"橘子", 2, 2250},{"草莓", 1, 1100},{"甜瓜", 6, 6700}};for(i = 0; i< N; i++) {for(s = a[i].size; s <= LIMIT; s++) {p = s - a[i].size;newvalue = value[p] + a[i].price;if(newvalue> value[s]) {// 找到阶段最佳解value[s] = newvalue;item[s] = i;}}}printf("物品\t价格\n");for(i = LIMIT; i>= MIN; i = i - a[item[i]].size) {printf("%s\t%d\n",a[item[i]].name, a[item[i]].price);}printf("合计\t%d\n", value[LIMIT]);return 0;}附砝码称重#include<stdio.h>int main(){intn,i;intvec[]={1,3,9,27,81};while(scanf("%d",&n)!=EOF){int first=0;n+=121;for(i=4;i>=0;n%=vec[i--])switch(n/vec[i]){case 0:printf("-%d",vec[i]);++first;break;case 2:printf("%s%d",first?"+":"",vec[i]);++first;}printf("\n");}}。
C语言动态规划之背包问题详解

C语⾔动态规划之背包问题详解01背包问题给定n种物品,和⼀个容量为C的背包,物品i的重量是w[i],其价值为v[i]。
问如何选择装⼊背包的物品,使得装⼊背包中的总价值最⼤?(⾯对每个武平,只能有选择拿取或者不拿两种选择,不能选择装⼊某物品的⼀部分,也不能装⼊物品多次)声明⼀个数组f[n][c]的⼆维数组,f[i][j]表⽰在⾯对第i件物品,且背包容量为j时所能获得的最⼤价值。
根据题⽬要求进⾏打表查找相关的边界和规律根据打表列写相关的状态转移⽅程⽤程序实现状态转移⽅程真题演练:⼀个旅⾏者有⼀个最多能装M公⽄的背包,现在有n件物品,它们的重量分别是W1、W2、W3、W4、…、Wn。
它们的价值分别是C1、C3、C2、…、Cn,求旅⾏者能获得最⼤价值。
输⼊描述:第⼀⾏:两个整数,M(背包容量,M<= 200)和N(物品数量,N<=30);第2…N+1⾏:每⾏两个整数Wi,Ci,表⽰每个物品的质量与价值。
输出描述:仅⼀⾏,⼀个数,表⽰最⼤总价值样例:输⼊:10 42 13 34 57 9输出:12解题步骤定义⼀个数组dp[i][j]表⽰容量为j时,拿第i个物品时所能获取的最⼤价值。
按照题⽬要求进⾏打表,列出对应的dp表。
W[i](质量)V[i](价值)01234567891000000000000210011111111133001334444444500135568899790013556991012对于⼀个动态规划问题设置下标时最好从0开始,因为动态规划经常会和上⼀个状态有关系!从上⾯的dp表可以看出来对于⼀个物品我们拿还是不难需要进⾏两步来判断。
第⼀步:判断背包当前的容量j是否⼤于物品当前的质量,如果物品的质量⼤于背包的容量那么就舍弃。
第⼆步:如果背包可以装下这个物品,就需要判断装下该物品获取的最⼤价值是不是⼤于不装下这个物品所获取的最⼤价值,如果⼤于那么就把东西装下!根据这样的思想我们可以得到状态转移⽅程:如果单签背包的容量可以装下物品:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);如果当前背包的容量装不下该物品:dp[i][j]=dp[i-1][j];#include <stdio.h>int max(const int a,const int b){return a>b ? a:b;}int main(){int w[35]={0},v[35]={0},dp[35][210]={0};int n,m;scanf("%d %d",&m,&n);int i,j;for(i=1;i<=n;i++){scanf("%d %d",&w[i],&v[i]);}for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(j>=w[i])//如果当前背包的容量⼤于商品的质量{dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);//判断是否应该拿下}else//⼤于背包的当前容量{dp[i][j]=dp[i-1][j];}}}for(int k=0;k<=n;k++){for(int l=0;l<=m;l++){printf("%d ",dp[k][l]);}printf("\n");}printf("%d\n",dp[n][m]);}通过运⾏以上程序可以看到最终的输出dp表和我们的预期是相符合的!但是并没有结束,动态规划有⼀个后⽆效性原则(当前状态只与前⼀个状态有关)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
intk;
if(tw+good[i].weight <=MaxWeight)
{
currentoption[i]=1;
if(i<nType-1)
CheckOut(i+1,tw+good[i].weight,totalvalue);
else
{
for(k=0;k<nType;++k)
option[k]=currentoption[k];
Maxvalue=totalvalue;
}
}
currentoption[i]=0;
if(totalvalue-good[i].value>Maxvalue)
{
if(i<nType-1)
CheckOut(i+1,tw,totalvalue-good[i].value);
else
{
for(k=0;k<nType;++k)
option[k]=currentoption[k];
Maxvalue=totalvalue-good[i].value;
}
}
}
void main()
{
inti;
doubleweight,value;
printf("请输入物品类别个数:");
scanf("%d",&nType);
printf("请输入各物品的重量和价值:");
doubletotalValue;/*输入的全部物品的总价值*/
doubleMaxWeight;/*输入的限制总重量*/
struct/*物品结构*/
{
double weight;
douቤተ መጻሕፍቲ ባይዱle value;
}good[N];
voidCheckOut(inti,doubletw,doubletotalvalue)
printf("总价值为: %2f",Maxvalue);
}
totalValue=0.0;
for(i=0;i<nType;++i)
{
scanf("%lf %lf",&weight,&value);
good[i].weight = weight;
good[i].value = value;
totalValue+= value;
}
printf("请输入限制重量:");
scanf("%lf",&MaxWeight);
Maxvalue=0.0;
for(i=0;i<nType;++i)
currentoption[i]=0;
CheckOut(0,0.0,totalValue);
for(i=0;i<nType;++i)
if(option[i])
printf("%d\t",i+1);
批注本地保存成功开通会员云端永久保存去开通
#include <stdio.h>
#define N 100 /*物品总种数*/
intnType;/*物品种数*/
intcurrentoption[N];/*当前解*/
intoption[N];/*所有解的集合*/
doubleMaxvalue;/*总价值*/