出差之前写一个0-1背包的程序吧

又要出差了,也不知道多久才能回来,这段时间应该都不能更新博客了,写了0-1背包程序热热手吧。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #define MAX_NUM     20   //物品最大个数
  5 #define MAX_PACK    100  //背包容量
  6
  7 int result[MAX_NUM][MAX_PACK]; //全局变量默认初始化0
  8
  9 /*
 10  * 0 1背包问题动态规划方程
 11  *
 12  * m[i][j]代表已经选完前i-1个物品背包容量剩余j时的最大值
 13  *
 14  * m[i][j] = {
 15  *         0                        j = 0 || i = 0;
 16  *               m[i-1][j]                    j < weight[i];
 17  *        max(m[i-1][j],m[i-1][j-weight[i]] + value[i])    j >= weight[i];
 18  *           }
 19  *
 20  */
 21
 22
 23 /*获取最大值得计算函数*/
 24 int knapsack(int weight[],int value[],int n,int m)
 25 {
 26     int i,j;
 27
 28     for(i = 1; i < n; i++)
 29     {
 30         for(j = 1; j <= m; j++)
 31         {//j 包含m
 32             if(weight[i] <= j)
 33             {//背包能放下该物品
 34                 if(result[i-1][j-weight[i]] + value[i] >= result[i-1][j])
 35                 {
 36                     result[i][j] = result[i-1][j-weight[i]] + value[i];
 37                 }
 38                 else
 39                 {
 40                     result[i][j] = result[i-1][j];
 41                 }
 42             }
 43             else
 44             {//背包不能放下该物品
 45                 result[i][j] = result[i-1][j];
 46             }
 47         }
 48     }
 49
 50     return result[n - 1][m];
 51 }
 52
 53 /*构造0 1背包的最优解---即哪些物品被选中了*/
 54 int knapsack_construct(int weight[],int n,int m,int selected[])
 55 {
 56     int i,contains;
 57
 58     contains = m;
 59     for(i = n - 1; i > 0; i--)
 60     {
 61         if(result[i][contains] > result[i - 1][contains])
 62         {//说明放了第i个物品
 63             selected[i] = 1;
 64             contains -= weight[i]; //更新背包容量
 65         }
 66         else
 67         {
 68             selected[i] = 0;
 69         }
 70
 71     }
 72 }
 73
 74
 75 int main()
 76 {
 77     int i,weight[MAX_NUM],value[MAX_NUM],m,n;
 78     int selected[MAX_NUM];
 79
 80     scanf("%d%d",&n,&m);
 81
 82     for(i = 0; i < n; i++)
 83     {
 84         scanf("%d%d",&weight[i],&value[i]);
 85     }
 86
 87     int max_value = knapsack(weight,value,n,m);
 88     printf("最大背包价值:%d\n",max_value);
 89
 90     knapsack_construct(weight,n,m,selected);
 91
 92     for(i = 0; i < n; i++)
 93     {
 94         if(selected[i] == 1)
 95         {
 96             printf("%d ",i + 1);
 97         }
 98     }
 99
100     printf("\n");
101 }
时间: 2024-10-06 03:38:03

出差之前写一个0-1背包的程序吧的相关文章

用java代码写一个简单的网上购物车程序

1 需求:1.写一个商品类,有商品编号.商品名称.商品分类.商品单价属性.2.写一个商品条目信息类,有商品和数量两个属性,有商品总价格方法. 2 3 3.写一个购物车类,有添加商品方法.查看订单信息,删除商品,修改商品,清空购物车,求购物车中所有商品总金额方法.4.写一个测试类,测试上述方法. 4 5 商品类: 6 [java] view plain copy 7 8 public class Product { 9 private int productId;// 商品编号 10 privat

用cmd写一个最简单的Java程序

一,准备: 1.确保电脑中装有eclipse软件并且确保配置好环境变量 (1)环境变量配置方法: 特别提示:jdk和eclipse保存的路径不能有中文字符 1.打开我的电脑--属性--高级--环境变量 2.新建系统变量 JAVA_HOME 变量名:JAVA_HOME 变量值:jdk的目录,比如d:/java 3. 选择“系统变量”中变量名为“Path”的环境变量双击该变量,把JDK安装路径中bin目录的绝对路径,添加到Path变量的值中,并使用半角的分号和已有的路径进行分隔. 变量名:Path

用ASP.Net写一个发送ICQ信息的程序

这里我给大家提供一个很实用的例子,就是在线发送ICQ信息.想一想我们在网页上直接给朋友发送ICQ信息,那是多么美妙的事情啊.呵呵,在吹牛啊,其实ICQ本来就有在线发送的代码,不过,这些都是AOL给你写好的代码,多没有意思啊.还是自已写的比较好,呵呵,废话少说,大家来看代码吧 <% @ Page Langua ge="C#" %> <% @ Assembly Name="System.Net" %> <% @ Import Namespa

用java写一个简单的文件拷贝程序吧

代码: public static void copyFile(String srcPath, String destPath) throws IOException { //建立File对象的来源与目的 File src = new File(srcPath); File dest = new File(destPath); //由于只能拷贝文件,所以判定输入流是否为文件 if(!src.isFile()) { System.out.println("只能拷贝文件!"); throw

写一个6位随机验证码程序,要求验证码中至少包含一个数字,一个小写字母,一个大写字母

import random,string src_list = []src_list.append(str(random.randint(1,9))) #生成一个数字src_list.append(random.sample(string.ascii_lowercase,1)[0]) #生成一个小写字母src_list.append(random.sample(string.ascii_uppercase,1)[0]) #生成一个大写字母three = random.sample(string.

写一个android内置android程序

当我们编译完毕android源代码之后,就须要对他做点什么事情,我如今正在看老罗的"Android源代码情景分析"一书.在这里主要是记录一些书中没有说清楚的地方. 相同.我们创建一个HelloWorld程序,以下看一下我的文件夹结构. 然后我们就像平时开发android程序一样.在第一个界面中放置一个 Hello World字符串,然后在自己的手机中測试一下.执行成功.好了.后面的工作比較重要. 在这里记录一下Android.mk里面的内容,这个是必须要有的.由于mmm编译的话.须要找

利用多线程写一个摇奖机小程序

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading; 9 using System.Threading.Tasks; 10 using System.Window

用 js 写一个获取随机颜色的程序

function getColor(){ var color="#"; for(var i=0;i<6;i++){ color+=(Math.random()*16 | 0).tostring(16); //|0表示取整 } return color; } 原文地址:https://www.cnblogs.com/8080zh/p/9224419.html

6.有学生提到,在大学选课的时候,可以写一个“刷课机”的程序,利用学校选课系统的弱点或漏洞,帮助某些人选到某些课程。或者帮助用户刷购票网站,先买到火车票。这些软件合法么?符合道德规范么?是在“软件工程”的研究范围么?

第一,显然,这些软件的合法性是存在一些问题的,当然也违反了我们当代道德规范的要求. 第二,利用利用我们所学到的科学手段去从事一些存在欺诈行为的事情也是违背了我们学习的宗旨. 作为高文化程度的人群,群体,利用科学知识去做一些违法乱纪的事情是很可怕的,然而这些违犯法律违背道德约束的软件开发到底属不属于“软件工程”的研究范围呢? 软件工程是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科.它涉及程序设计语言.数据库.软件开发工具.系统平台.标准.设计模式等方面. 在现代社会中,软件应用