题目链接: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]-,c);
for(int j=; j<=jMax; j++)
p[n][j]=;//第n个物品,这里都装不下
for(int j=w[n]; j<=c; j++)
p[n][j]=v[n];//第n个物品,这里都装得下
//开始递推计算到p[2][c];
for(int i=n-; i>; i--)
{
jMax=min(w[i]-,c);
for(int j=; j<=jMax; j++)
p[i][j]=p[i+][j];//装不下
for(int j=w[i]; j<=c; j++)
p[i][j]=max(p[i+][j],p[i+][j-w[i]]+v[i]);
}
p[][c]=p[][c];
if(c>=w[])
p[][c]=max(p[][c],p[][c-w[]]+v[]);
} void traceback(int c,int n,int x[])
{
for(int i=;i<n;i++)
{
if(p[i][c]==p[i+][c])
x[i]=;
else
{
x[i]=;
c=c-w[i];
}
}
x[n]=(p[n][c])?:;
} int main()
{
int memory[NUM];
int C,N;///C为容量,N为物品个数
while(scanf("%d%d",&N,&C)!=EOF)
{
memset(p,,sizeof(p));
for(int i=; i<=N; i++)
{
scanf("%d",&w[i]);
scanf("%d",&v[i]);
}
knapsack(C,N);
printf("%d\n",p[][C]);
traceback(C,N,memory);
for(int i=;i<=N;i++)
printf("%d ",memory[i]);
return ;
}
}

但是,很遗憾,Runtime Error

这里可以转化为一维DP

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

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

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

递推公式:

for(int i=;i<=n;i++)
{
for(int j=W;j>=;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,,sizeof(p));
for(i=;i<=n;i++)
{
for(j=W;j>=;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=;i<=n;i++)
scanf("%d%d",&w[i],&val[i]);
knapsack();
printf("%d\n",p[W]);
}
return ;
}

动态规划(DP),0-1背包问题的更多相关文章

  1. hdu2602Bone Collector ——动态规划(0/1背包问题)

    Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...

  2. 0/1背包问题(DP)

    Description 给定 n 个物品和一个背包.物品 i 的重量是 wi ,其价值为 vi ,背包的容量为 C .问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? Input 输入 ...

  3. 算法-动态规划DP小记

    算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...

  4. 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列

    0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...

  5. 蓝桥杯 0/1背包问题 (java)

      今天第一次接触了0/1背包问题,总结一下,方便以后修改.不对的地方还请大家不啬赐教! 上一个蓝桥杯的例题: 数据规模和约定 代码: import java.util.Scanner; public ...

  6. 动态规划:HDU1059-Dividing(多重背包问题的二进制优化)

    Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. HDU 2084 数塔 (动态规划DP)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 题目分析:此题采用动态规划自底向上计算,如果我们要知道所走之和最大,那么最后一步肯定是走最后一排 ...

  8. 动态规划dp

    一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...

  9. [JL]最后的晚餐 动态规划(DP) codevs5318

    [JL]最后的晚餐 TimeLimit:1000MS  MemoryLimit:1000KB 64-bit integer IO format:%lld Problem Description [题库 ...

  10. Jury Compromise---poj1015(动态规划,dp,)

    题目链接:http://poj.org/problem?id=1015 大致题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n 个人作为陪审团的候 ...

随机推荐

  1. RabbitMQ之消息持久化

    消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化. 为了保证RabbitMQ在退出或者crash等异常情况下数据没有丢失,需要将queue,exch ...

  2. 数据库nomount mount open阶段走向

    先来简要了解一下Oracle数据库体系架构以便于后面深入理解,Oracle Server主要由实例(instance)和数据库(database)组成.实例(instance)由共享内存(SGA)和后 ...

  3. org.hibernate.QueryException: duplicate alias: r hibernate别名重复问题解决

    今天做项目的过程中发现,多表查询的时候如果使用hibernate的DetachedCriteria离线查询方式的时候, 在多表关联的时候我们需要使用别名的方式去实现. 但是代码运行的过程中抛出了下面的 ...

  4. 数据库~大叔通过脚本生成poco实体

    今天在做开发时,需要把表映射成实体,又没有EF这种工具,就从网上下了一个工具,但使用时觉得太重了,所以就自己写了一个,基于mysql的. 功能:输入表名,得到这个表的poco实体 SELECT COL ...

  5. Python高级用法------字典无需提前定义key

    from collections import defaultdict import json def tree(): return defaultdict(tree) categories = tr ...

  6. AngularJS-自定义过滤器 ng-repeat 求和

    <!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8& ...

  7. 【Q】类和对象:游戏角色开发(角色介绍)

    案例情景:某公司要开发新游戏,请用面向对象的思想设计英雄类.怪物类和武器类. 编写测试类,创建英雄对象.怪物对象和武器对象,并输出各自的信息. 其中设定分别如下: 1.英雄类 属性:英雄名字.生命值. ...

  8. java中try-catch-finally中的return语句

    在try-catch-finally语句中使用return语句遇到了一些疑问 代码一: static int intc(){ int x =0; try{ x=1; return x; }finall ...

  9. WinSock2 API

    title: WinSock2 API tags: [WinSock, 网络编程, WinSock2.0 API, 动态加载, WinSock 异步函数] date: 2018-07-21 10:36 ...

  10. 对 Vue 的理解(一)

    一.什么是 Vue ? 首先,Vue 是一个 MVVM 框架,M -- 模型,就是用来定义驱动的数据,V -- 视图,是经过数据改变后的 html,VM -- 框架视图,就是用来实现双向绑定的中间桥梁 ...