0/1 背包 dp问题
2016-01-26 22:21
302 查看
//20160126 //0/1背包 //W 能装下的重量 //w 该物品的重量 //v 该物品的价值 #include<iostream> #include<algorithm> using namespace std; #define MAX_N 101 int n; pair<int,int> object[MAX_N];//first=w,second=v int W; int dp[MAX_N][MAX_N]; int rec(int i,int j) { if(dp[i][j]>0) return dp[i][j]; else{ int res; if(i==n) res=0; else if(j<object[i].first) { res=rec(i+1,j); } else { res=max(rec(i+1,j),rec(i+1,j-object[i].first)+object[i].second); } return dp[i][j]=res; } } void solve() { cout<<rec(0,W)<<endl; } int main() { while(cin>>n) { for(int i=0;i<n;i++) { cin>>object[i].first; cin>>object[i].second; } cin>>W; solve(); } }
由此可得一个dp公式
dp
[j]=0
dp[i][j]= dp[i+1][j] j<w[i]
max(dp[i+1][j],dp[i+1][j-w[i]+v[i]);
//20150127 //dp #include<iostream> #include<algorithm> using namespace std; #define MAX_N 101 #define MAX_W 10001 pair<int,int> p[MAX_N];//first=w,second=v int n; int W; int dp[MAX_N][MAX_W]; int solve() { for(int i=n-1;i>=0;i--) { for(int j=0;j<=W;j++) { if(j<p[i].first) dp[i][j]=dp[i+1][j]; else dp[i][j]=max(dp[i+1][j],dp[i+1][j-p[i].first]+p[i].second); } } return dp[0][W]; } int main() { cin>>n; for(int i=0;i<n;i++) { cin>>p[i].first>>p[i].second; } cin>>W; cout<<solve()<<endl; }
相关文章推荐
- docker学习(3) 容器的启动过程
- $where $options: 'g','i'
- Windows Thrift安装及HelloWorld
- 进程与线程的对比
- 1021. 个位数统计 (15)
- 正则表达式--灵活的艺术
- 把字符串转换成整数
- 添加module
- android的picasso强大的图片下载缓存库
- web前端知识结构图
- 动态代理
- 一起talk C栗子吧(第一百一十三回:C语言实例--线程同步之信号量一)
- javascript语音详解(转载)
- 沿着path路径做动画
- 学习Django
- 项目文件介绍
- webstrom快捷键
- 又要留在北京过年了
- mysql主从复制
- POJ3436 ACM Computer Factory