• 完全背包


    时间限制: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;
    }
  • 相关阅读:
    grpc源码分析之域名解析
    使用swig工具为go语言与c++进行交互
    使用VS2015编译grpc_1.3.1
    在linux中编译grpc
    win32网络模型之重叠I/O
    滚动动画animate-scroll扩展
    Android Studio Gradle更新的解决办法
    MUI——页面的创建、显示、关闭
    VS2013中使用QT插件后每次重新编译问题
    Oracle Rman恢复
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11746038.html
Copyright © 2020-2023  润新知