zoukankan      html  css  js  c++  java
  • 30-01背包的最优解

    题目内容:
    背包最大允许装载为C, 有n个物品要放进背包,每个物品的重量为w[1],w[2],...w[n],每个物品的价值为v[1],v[2],...v[n], 请选择物品装进背包,使得价值最大。C为整数。
    输入描述
    第一行为物体个数n,以及背包容量C;
    第二行为n个重量(实数),空格隔开
    第三行为n个价值(实数),空格隔开

    输出描述
    第一行为最大装载的总价值
    第二行为每个物品是否装载,1表示装,0表示不装,中间用空格隔开
    (测试数据能保证最优解唯一)

    输入样例
    5 10
    2 2 6 5 4
    6 3 5 4 6

    输出样例
    15
    1 1 0 0 1

    思路: 为了得到最优解,用了二维数组。
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int dp[1000][1000];
    int w[1000], v[1000];
    int a[1000];
    int main(){
    	int m, c;
    	cin >> m >> c;
    	for(int i = 1; i <= m; i++)
    		cin >> w[i];	
    	for(int i = 1; i <= m; i++)
    		cin >> v[i];
    	for(int i = 1; i <= m; i++){
    		for(int j = 0; j <= c; j++){   //背包可以为0 
    			if(i != 1)
    				dp[i][j] = dp[i - 1][j];
    			if(j >= w[i])
    				dp[i][j] = (dp[i][j] > dp[i - 1][j - w[i]] + v[i] ? dp[i][j] : dp[i - 1][j - w[i]] + v[i]);
    //			cout << dp[i][j] << " ";
    		}
    //		cout << endl;
    	}	
    	cout << dp[m][c] << endl;
    	int b = c;
    	for(int i = m; i >= 1; i--){
    		if(dp[i][b] > dp[i - 1][b]){
    			a[i] = 1;
    			b -= w[i];
    		}	
    	}
    	for(int i = 1; i <= m; i++)
    		cout << a[i] << " ";
    	return 0;
    }
    
  • 相关阅读:
    关于metaclass,我原以为我是懂的
    有趣的版本号
    关于乱序(shuffle)与随机采样(sample)的一点探究
    我在博客园的这一年
    我的进程去哪儿了,谁杀了我的进程
    Elasticsearch学习系列之term和match查询
    数据库垂直拆分 水平拆分
    分布式锁的几种实现原理
    Redis常见面题
    github建仓库注意
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7450403.html
Copyright © 2011-2022 走看看