背包问题
来源:互联网 发布:office2011 mac破解版 编辑:程序博客网 时间:2024/05/28 23:12
#include<iostream>using namespace std;int max(int x,int y){if(x>y) return x;else return y;}int min(int x,int y){if(x<y) return x;else return y;}void Knapsack(int *v,int *w,int c,int n,int m[][1000]){int jMax=min(w[n]-1,c);for(int j=0;j<=jMax;j++) m[n][j]=0;for(int j=w[n];j<=c;j++) m[n][j]=v[n];for(int i=n-1;i>=1;i--){jMax=min(w[i]-1,c);for(int j=0;j<=jMax;j++) m[i][j]=m[i+1][j];for(int j=w[i];j<=c;j++) m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);}}void Traceback(int m[][1000],int *w,int c,int n,int *x){for(int i=1;i<n;i++){if(m[i][c]==m[i+1][c]) x[i]=0;else{x[i]=1;c-=w[i];}}x[n]=(m[n][c])?1:0;}int main(){int w[10];//各个物品的重量 int c;//背包容量int v[10];//各个物品的价值int n;//物品的个数int m[10][1000];//对于m[i][j] 而言,其表示m(i,j)的最优解,即背包容量为j,可选物品为i,i+1,...,n时0-1背包问题的最优值int x[10];//标记各个物品是否装入 /*递归表达式如下:m(i,j)=max{m(i+1,j),m(i+1,j-w[i])+v[i]} j>=w[i] =m(i+1,j) 0<=j<w[i] m(n,j)=v[n] j>=w[n] =0 0<=j<w[n]*/ cin>>c;cin>>n;for(int i=1;i<=n;i++){cin>>w[i]>>v[i];}Knapsack(v,w,c,n,m);Traceback(m,w,c,n,x);cout<<m[1][c]<<endl;for(int i=1;i<=n;i++)cout<<x[i]<<endl;return 0;}
0 0
- 【无限背包】背包问题
- 背包问题---01背包
- 背包问题--部分背包
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- unix笔记
- mysql不能创建外键
- 多点触摸交互处理,放大缩小
- 有关Floyd算法问题
- 聚来宝是真的吗?
- 背包问题
- 兔子--android SDK支持的3中不可逆转的加密算法
- 1->Oracle10g体系结构概述
- thrift介绍及应用(二)—简单应用
- 第十六周项目二——用指针玩字符串(5.去除句子第一个单词前的空格)
- SQL 用游标读取一个表集合
- 近来工作和面试一些人的感受(转)
- ORA-**,oracle 12c操作问题
- Struts2学习笔记——订制自己的Interceptor