zoukankan      html  css  js  c++  java
  • 完全背包

    时间限制:3500 ms  |  内存限制:65535 KB
    难度:4
     
    描述

    直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是c,价值是w。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。本题要求是背包恰好装满背包时,求出最大价值总和是多少。如果不能恰好装满背包,输出NO

     
    输入
    第一行: N 表示有多少组测试数据(N<7)。 
    接下来每组测试数据的第一行有两个整数M,V。 M表示物品种类的数目,V表示背包的总容量。(0<M<=2000,0<V<=50000)
    接下来的M行每行有两个整数c,w分别表示每种物品的重量和价值(0<c<100000,0<w<100000)
    输出
    对应每组测试数据输出结果(如果能恰好装满背包,输出装满背包时背包内物品的最大价值总和。 如果不能恰好装满背包,输出NO)
    样例输入
    2
    1 5
    2 2
    2 5
    2 2
    5 1
    样例输出
    NO
    

    1

    思路:完全背包

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn = 2020;
    #define INF 0x3f3f3f3f
    int dp[50050],v[maxn],w[maxn];
    int m,n;
    int main()
    {
    	int t;
    	cin>>t;
    	while(t--)
    	{
    		scanf("%d %d",&m,&n);
    		for(int i = 1;i<=m;i++){
    			scanf("%d %d",&w[i],&v[i]);
    		}
    		memset(dp,-1*INF,sizeof(dp));
    		dp[0] = 0;
    		for(int i = 1;i<=m;i++){
    			for(int k = w[i];k<=n;k++){
    				dp[k] = dp[k]>dp[k-w[i]]+v[i]?dp[k]:dp[k-w[i]]+v[i];
    			}
    		}
    		if(dp[n] < 0) printf("NO
    ");
    		else{
    			printf("%d
    ",dp[n]);
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    mysql 删除与安装
    mysql 中文乱码 或 问号
    系统锁屏
    技术相关
    织梦 php 网站建设
    linux mysql 安装与使用
    技术收集
    批处理 关闭 进程
    二十三种设计模式
    三星(samsung)手机i699内容:解锁boot loader,刷recovery,刷机(刷rom),root综合教程
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11746038.html
Copyright © 2011-2022 走看看