求助QaQ!P1064怎么解(DP解法)
  • 板块题目总版
  • 楼主Targanzqq
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/11/23 07:31
  • 上次更新2023/10/27 01:52:43
查看原帖
求助QaQ!P1064怎么解(DP解法)
555617
Targanzqq楼主2022/11/23 07:31

P1064解了5个小时,还是解不出来ww

主要因为我太蒟蒻了,连DP都不会
有没有julao帮忙检查一下代码QwQ\

#include<bits/stdc++.h>
using namespace std;
int n,m,a[70]={0},b[70]={0},w1[70]={0},w2[70]={0},k[70]={0},k1[70]={0},k2[70]={0},f[70][33000]={0};
//a数组存附件的费用,b数组存主件的费用,w1数组存附件的价值,w2数组存主件的价值
//k数组输入附件对应的主件,k1数组存第一个附件对应的主件,k2数组存第二个附件对应的主件
int main()
{
    cin>>n>>m;
    int h=0; 
    for(int i=1;i<=m;i++){
    	cin>>a[i]>>w1[i]>>k[i];
    	w1[i]*=a[i];
    	if(k[i]==0){
    		h++;b[h]=a[i];w2[h]=w1[i];
		}
		else if(k1[k[i]]==0)k1[k[i]]=i;
		else k2[k[i]]=i;
	}
	for(int i=1;i<=h;i++){
		for(int j=n;j>=1;j--){
		    f[i][j]=max(f[i][j],f[i-1][j]);//初始化
			if(j-b[i]-a[k1[i]]-a[k2[i]]>=0)//两个都选
			    f[i][j]=max(f[i][j],f[i-1][j-b[i]-a[k1[i]]-a[k2[i]]]+w2[i]+w1[k1[i]]+w1[k2[i]]);
			if(j-b[i]-a[k2[i]]>=0)//选第二个附件
			    f[i][j]=max(f[i][j],f[i-1][j-b[i]-a[k2[i]]]+w2[i]+w1[k2[i]]);
			if(j-b[i]-a[k1[i]]>=0)//选第一个附件
			    f[i][j]=max(f[i][j],f[i-1][j-b[i]-a[k1[i]]]+w2[i]+w1[k1[i]]);
			if(j-b[i]>=0)//两个都不选
			    f[i][j]=max(f[i][j],f[i-1][j-b[i]]+w2[i]);
		} 
	}
	cout<<f[h][n];
} 

60pts

2022/11/23 07:31
加载中...