动态规划之混合背包模板

P1833 樱花 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

何为混合,混合也就是混合了01背包,多重背包,完全背包的混合体。通过判断物品的件数,如果是1件就是01背包,无限量就是完全背包的算法,有限件就是多重背包的算法。上模板


import java.awt.FontFormatException;
import java.io.BufferedReader; 
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.AnnotatedWildcardType;
import java.math.BigInteger;
import java.net.DatagramPacket;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Spliterator.OfPrimitive;
import java.util.function.IntToDoubleFunction;
import java.util.function.LongBinaryOperator;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.management.relation.InvalidRelationTypeException;
import javax.print.attribute.standard.JobMessageFromOperator;
import javax.print.attribute.standard.JobPriority;
import javax.swing.table.TableModel;
import javax.swing.text.TabSet;
public class Main {
  public static void main(String[] args) throws IOException  {
Scanner sc=new Scanner(System.in);
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String aaa1=br1.readLine();
String[] bbb1=aaa1.split(" ");
String aString=bbb1[0];
String bString=bbb1[1];
int n=Integer.parseInt(bbb1[2]);
//System.out.println(aString+" "+bString+" "+n);
String[] aStrings=aString.split(":");
String[] bStrings=bString.split(":");
int a=(Integer.parseInt(aStrings[0])*60)+Integer.parseInt(aStrings[1]);
int b=(Integer.parseInt(bStrings[0])*60)+Integer.parseInt(bStrings[1]);
int c=b-a;
//System.out.println(c);
int[] dp=new int[c+1];

int d;
int x,y;
for(d=1;d<=n;d++) {
	String cString=br1.readLine();
	//System.out.println(cString+" "+d);
	String[] cStrings=cString.split(" ");
	int e=Integer.parseInt(cStrings[0]);
	int f=Integer.parseInt(cStrings[1]);
	int g=Integer.parseInt(cStrings[2]);
	//System.out.println(e+" "+f+" "+g);
	if(g==1) {
			for(y=c;y>=e;y--) {
				dp[y]=Math.max(dp[y], dp[y-e]+f);		
		}
	}
	else if(g==0) {		
			for(y=e;y<=c;y++) {
				dp[y]=Math.max(dp[y], dp[y-e]+f);		
		}
	}
	else {
				
			int a1=Math.min(g, c/e);
			for(int k=1;a1>0;k=k*2) {
				if(k>a1) {
					k=a1;
				}
				a1=a1-k;
				for(y=c;y>=k*e;y--) {
					dp[y]=Math.max(dp[y], dp[y-e*k]+f*k);
				}
			}
		
	}
}
System.out.println(dp[c]);
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值