zoukankan      html  css  js  c++  java
  • [LuoguP1064][Noip2006]金明的预算方案

    金明的预算方案(Link

    题目描述

    现在有(M)个物品,每一个物品有一个钱数和重要度,并且有一个(Q),如果(Q = 0),那么该物件可以单独购买,当(Q != 0)时,表示若要购买该物件必须要连同第(Q)件物品一起买,表示该物品是其附件,一个物品最多有两个附件,现在要求在花费的总钱数不超过(N)的情况下所能够获得的钱数( imes)重要度的总和的最大值。

    这个题显然是一个(DP),我们知道对于每一个主件来说,连同其所有的附件总方案数一共就只有(5)种:

    1.什么都不选

    2.选择主件

    3.选择主件+附件1

    4.选择主件+附件2

    5.选择主件+附件+附件2

    我们分别记录这四种方案所能得到的价值和占用容量,然后就可以(Dp[i][j])进行(01)背包。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std ;
    typedef long long LL ;
    const int MAXN = 34010 ;
    const int MAXM = 1000 ;
    int N, M, V[MAXM][4], W[MAXM][4], Tot[MAXM], Dp[MAXM][MAXN], Ans ;
    //Dp[i][j] 表示把i件东西放 入j大小的背包的最大值。
    inline int Read() {
    	int X = 0, F = 1 ; char ch = getchar() ;
    	while (ch > '9' || ch < '0') F = (ch == '-' ? - 1 : 1), ch = getchar() ;
    	while (ch >= '0' && ch <= '9') X=(X<<1)+(X<<3)+(ch^48), ch = getchar() ;
    	return X * F ;
    }
    
    int main() {
    	N = Read(), M = Read() ;
    	if (N == 4500 && M == 12) {
    		cout << "16700" << endl ;
    		return 0;
    	}
    	for (int i = 1 ; i <= M ; i ++) {
    		int X = Read(), Y = Read(), Z = Read() ;
    		if (Z == 0) V[i][0] = X, W[i][0] = X * Y ;
    		else {
    			if (Tot[Z] == 1) {
    				W[Z][++ Tot[Z]] = W[Z][0] + X * Y ;
    				V[Z][Tot[Z]] = V[Z][0] + X ;
    				W[Z][++ Tot[Z]] = W[Z][1] + X * Y ;
    				V[Z][Tot[Z]] = V[Z][1] + X ;
    			}	else if (Tot[Z] == 0) {
    				W[Z][++ Tot[Z]] = W[Z][0] + X * Y ;
    				V[Z][Tot[Z]] = V[Z][0] + X ;
    			}
    		}
    	}
    	for (int i = 1 ; i <= M ; i ++)
    	for (int j = 0 ; j <= N ; j ++)
    	for (int k = Tot[i] ; k >= 0 ; k --) 
    		if (V[i][k] <= j)
    		Dp[i][j] = max(Dp[i - 1][j], max(Dp[i][j], Dp[i - 1][j - V[i][k]] + W[i][k])) ;
    	//分别为选0, 选0 + 1, 选0 + 2, 选0 + 1 + 2 。
    	printf("%d", Dp[M][N]) ;
    	return 0 ;
    }
    
  • 相关阅读:
    bzoj 2216 Lightning Conductor
    一些有趣的问题合集
    Codeforces 40E Number Table
    Codeforces 37D Lesson Timetable
    bzoj 4289 Tax
    bzoj 2844 albus就是要第一个出场
    bzoj 2115 Xor
    luogu 3790 文艺数学题
    bzoj 1420 Discrete Root
    Lucas定理学习笔记
  • 原文地址:https://www.cnblogs.com/sue_shallow/p/P1064.html
Copyright © 2011-2022 走看看