• CJOJ 2307 【一本通】完全背包(动态规划)


    CJOJ 2307 【一本通】完全背包(动态规划)

    Description

    设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。

    Input

    第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);
    第2..N+1行:每行二个整数Wi,Ui,表示每个物品的重量和价值。

    Output

    仅一行,max=一个数,表示最大总价值。

    Sample Input

    10 4
    2 1
    3 3
    4 5
    7 9

    Sample Output

    max=12

    Http

    CJOJ:http://oj.changjun.com.cn/problem/detail/pid/2037

    Source

    动态规划

    解决思路

    a设F[i][j]表示前i件物品重量为j时的最大价值,所以有
    F[i][j]=max(F[i-1][j],F[i-1][j-V[i]]+W[i])

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    
    const int maxN=1000;
    const int maxM=300;
    const int inf=2147483647;
    
    class Item
    {
    public:
    	int weight,value;
    };
    
    int n,M;
    vector<Item> I;
    int F[maxN][maxM]={0};
    
    int main()
    {
    	int a,b;
    	cin>>M>>n;
    	I.push_back((Item){0,0});
    	for (int i=1;i<=n;i++)
    	{
    		cin>>a>>b;
    		int k=M/a;
    		for (int j=1;j<=k;j++)
    			I.push_back((Item){a,b});
    	}
    	int Ans=0;
    	for (int i=1;i<I.size();i++)
    	{
    		for (int j=1;j<=M;j++)
    		{
    			if (j-I[i].weight>=0)
    				F[i][j]=max(F[i-1][j],F[i-1][j-I[i].weight]+I[i].value);
    			else
    				F[i][j]=F[i-1][j];
    			Ans=max(Ans,F[i][j]);
    			//cout<<F[i][j]<<' ';
    		}
    		//cout<<endl;
    	}
    	cout<<"max="<<Ans<<endl;
    	return 0;
    }
    
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    01、MySQL_简介
    算法—打擂台法
    第10章 对文件的输入输出
    第9章 用户自己建立数据类型
    Spring Cloud
    JUC
    Swagger Learing
    JUC
    Spring Data
    SpringCloud
  • 原文地址:https://www.cnblogs.com/SYCstudio/p/7137885.html
Copyright © 2020-2023  润新知