博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
0-1背包
阅读量:4977 次
发布时间:2019-06-12

本文共 2527 字,大约阅读时间需要 8 分钟。

时限:1000ms 内存限制:10000K  总时限:3000ms

描述
需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
 
输入
多个测例,每个测例的输入占三行。第一行两个整数:n(n<=10)和c,第二行n个整数分别是w1到wn,第三行n个整数分别是p1到pn。
n 和 c 都等于零标志输入结束。
 
输出
每个测例的输出占一行,输出一个整数,即最佳装载的总价值。
 
输入样例
1 2
1
1
2 3
2 2
3 4
0 0
 
输出样例
1
4
 
二维DP解法:
 
/* * @author  Panoss */#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define DBG 1#define fori(i,a,b) for(int i = (a); i < (b); i++)#define forie(i,a,b) for(int i = (a); i <= (b); i++)#define ford(i,a,b) for(int i = (a); i > (b); i--)#define forde(i,a,b) for(int i = (a); i >= (b); i--)#define forls(i,a,b,n) for(int i = (a); i != (b); i = n[i])#define mset(a,v) memset(a, v, sizeof(a))#define mcpy(a,b) memcpy(a, b, sizeof(a))#define dout DBG && cerr << __LINE__ << " >>| "#define checkv(x) dout << #x"=" << (x) << " | "<
> x#define MIN_LD -2147483648#define MAX_LD 2147483647#define MIN_LLD -9223372036854775808#define MAX_LLD 9223372036854775807#define MAX_INF 18446744073709551615inline int reint() { int d; scanf("%d",&d); return d; }inline long relong() { long l; scanf("%ld",&l); return l; }inline char rechar() { scanf(" "); return getchar(); }inline double redouble() { double d; scanf("%lf", &d); return d; }inline string restring() { string s; cin>>s; return s; }const int N = 1024;int w[N],p[N]; int f[N][N];/* f[i][j]代表前i件物品容量为j的最大值状态转移方程f[i][j] = max(f[i-1][j-w[i]]+p[i],f[i-1][j])*/void DP(int n,int c) ///从n件物品选出物品,使容量最大值,不超过c{ mset(f,0); forie(i,1,n) ///从第一件物品开始,自低向上 { forie(j,0,c) ///枚举背包容量,自低向上 { if(j>=w[i]) { f[i][j] = max(f[i-1][j-w[i]]+p[i],f[i-1][j]); } else f[i][j] = f[i-1][j]; } }}int main(){ int n,c; while(cin>>n>>c,(n+c)) { forie(i,1,n) cin>>w[i]; forie(i,1,n) cin>>p[i]; DP(n,c); cout<
<

 

一维DP解法:

 

const int N = 1024;int w[N],p[N];int d[N];///    d[i]表示体积为i的最大值///    状态转移方程d[i] = max(d[i-w[i]]+p[i],d[i])void DP(int n,int c)  ///从n件物品选出物品,使容量最大值,不超过c{    mset(d,0);    forie(i,1,n)      ///从第一件物品开始,自低向上    {        forde(j,c,w[i])   ///枚举背包容量,注意方向,从c至w[i]        {            if(j>=w[i])            {                d[j] = max(d[j-w[i]]+p[i],d[j]);            }        }    }}int main(){    int n,c;    while(cin>>n>>c,(n+c))    {        forie(i,1,n) cin>>w[i];        forie(i,1,n) cin>>p[i];        DP(n,c);        cout<
<

 

转载于:https://www.cnblogs.com/Panoss/p/3741967.html

你可能感兴趣的文章
类对象
查看>>
[Voice communications] 声音的滤波
查看>>
SQL语言之概述(一)
查看>>
软件建模——第9章 毕业论文管理系统—面向对象方法
查看>>
[SDOI2008]洞穴勘测
查看>>
Difference between Linearizability and Serializability
查看>>
IDEA使用操作文档
查看>>
UIView
查看>>
添加日期选择控件
查看>>
bzoj4765: 普通计算姬 (分块 && BIT)
查看>>
看完漫画秒懂区块链
查看>>
Oracle命令类别
查看>>
stc12c5a60s2驱动TEA5767收音机模块硬件调试总结
查看>>
vue中提示$index is not defined
查看>>
css选择器
查看>>
ASP.NET上传下载文件
查看>>
Galaxy Nexus 全屏显示-隐藏Navigation Bar
查看>>
Spring中使用Velocity模板
查看>>
上周热点回顾(8.18-8.24)
查看>>
Feature toggle
查看>>