当前位置: 首页 > news >正文

动态规划(DP),0-1背包问题

题目链接:http://poj.org/problem?id=3624

1、p[i][j]表示,背包容量为j,从i,i+1,i+2,...,n的最优解。

2、递推公式

p[i][j]=max(p[i+1][j],p[i+1][j-w[i]]+v[i]);

#include <stdio.h>
#include <algorithm>
#include <string.h>
#define NUM 3410 //物品数量的上限
#define CAP 1300 //背包容量的上限

using namespace std;

int w[NUM];//物品的重量
int v[NUM];//物品的价值
int p[NUM][CAP];//p[i][j]表示背包容量为j时,可选物品为i,i+1,...n时的01背包问题的最优解
//题意就是求p[1][c];

//递推表达式即为p[i][j]=max(p[i+1][j],p[i+1][j-w[i]]+v[i]);
//下面递推求出p[1][c];
void knapsack(int c,int n)//c为背包容量,n为物品的数量
{
    //计算递推边界
    int jMax=min(w[n]-1,c);
    for(int j=0; j<=jMax; j++)
        p[n][j]=0;//第n个物品,这里都装不下
    for(int j=w[n]; j<=c; j++)
        p[n][j]=v[n];//第n个物品,这里都装得下
    //开始递推计算到p[2][c];
    for(int i=n-1; i>1; i--)
    {
        jMax=min(w[i]-1,c);
        for(int j=0; j<=jMax; j++)
            p[i][j]=p[i+1][j];//装不下
        for(int j=w[i]; j<=c; j++)
            p[i][j]=max(p[i+1][j],p[i+1][j-w[i]]+v[i]);
    }
    p[1][c]=p[2][c];
    if(c>=w[1])
        p[1][c]=max(p[1][c],p[2][c-w[1]]+v[1]);
}

void traceback(int c,int n,int x[])
{
    for(int i=1;i<n;i++)
    {
        if(p[i][c]==p[i+1][c])
            x[i]=0;
        else
        {
            x[i]=1;
            c=c-w[i];
        }
    }
    x[n]=(p[n][c])?1:0;
}

int main()
{
    int memory[NUM];
    int C,N;///C为容量,N为物品个数
    while(scanf("%d%d",&N,&C)!=EOF)
    {
        memset(p,0,sizeof(p));
        for(int i=1; i<=N; i++)
        {
            scanf("%d",&w[i]);
            scanf("%d",&v[i]);
        }
        knapsack(C,N);
        printf("%d\n",p[1][C]);
        traceback(C,N,memory);
        for(int i=1;i<=N;i++)
            printf("%d ",memory[i]);
        return 0;
    }
}

但是,很遗憾,Runtime Error

这里可以转化为一维DP

p[i]表示背包容量为i 时的最优解

memset(p,0,sizeof(p));

然后遍历所有物品,更新p

递推公式:

 

for(int i=1;i<=n;i++)
{
    for(int j=W;j>=1;j--)
    {
        if(j>w[i]&&p[j-w[i]]+val[i]>p[j])
            p[i]=p[j-w[i]]+val[i];
    }
}

Source Code

#include <stdio.h>
#include <string.h>
#define N 3500 ///物品数量上限
#define M 13000///背包容量上限

int w[N];///物品重量
int val[N];///物品价值
int p[M];///p[i]表示背包容量为i时的最优解
int n;///物品个数
int W;///背包容量

///求p[W];
void knapsack()
{
    int i,j;
    memset(p,0,sizeof(p));
    for(i=1;i<=n;i++)
    {
        for(j=W;j>=1;j--)
        {
            ///当前第i个物品装得下,而且比不装要优
            if(j>=w[i]&&p[j-w[i]]+val[i]>p[j])
                p[j]=p[j-w[i]]+val[i];
        }
    }
    return ;
}

int main()
{
    int i;
    while(scanf("%d%d",&n,&W)!=EOF)
    {
        for(i=1;i<=n;i++)
            scanf("%d%d",&w[i],&val[i]);
        knapsack();
        printf("%d\n",p[W]);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/TreeDream/p/5248660.html

相关文章:

  • 各大公司广泛使用的在线学习算法FTRL详解
  • .Net CF下精确的计时器
  • SSH 正向/反向代理小记
  • 寻求最快解决方案
  • [MAT]使用MAT比較多个heap dump文件
  • nagios 主机状态
  • FZU 1692 Key problem (构造矩阵)
  • 【分享】通过Excel生成批量SQL语句,处理大量数据的好办法
  • SGU 122 The book(构造)
  • 全局dialog,在小米4及部分机型上不能正常弹出
  • DOM常用操作
  • docker学习笔记7:发布镜像到docker hub上
  • Java通过wait()和notifyAll()方法实现线程间的通信
  • Ado.NET SQLHelper
  • ubuntu14.04 忘记root密码
  • JavaScript-如何实现克隆(clone)函数
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • CSS魔法堂:Absolute Positioning就这个样
  • ECMAScript6(0):ES6简明参考手册
  • IOS评论框不贴底(ios12新bug)
  • JAVA并发编程--1.基础概念
  • Java多态
  • Java应用性能调优
  • Linux后台研发超实用命令总结
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • oldjun 检测网站的经验
  • Promise初体验
  • select2 取值 遍历 设置默认值
  • 后端_MYSQL
  • 我这样减少了26.5M Java内存!
  • 在Unity中实现一个简单的消息管理器
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # Java NIO(一)FileChannel
  • #include到底该写在哪
  • $$$$GB2312-80区位编码表$$$$
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .describe() python_Python-Win32com-Excel
  • .NET : 在VS2008中计算代码度量值
  • .net 4.0发布后不能正常显示图片问题
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Framework杂记
  • .Net IOC框架入门之一 Unity
  • .NET 的程序集加载上下文
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET下的多线程编程—1-线程机制概述
  • /var/spool/postfix/maildrop 下有大量文件
  • @synthesize和@dynamic分别有什么作用?