求助。。。(50-60-30-10-0分曲线)(崩溃)
查看原帖
求助。。。(50-60-30-10-0分曲线)(崩溃)
192397
Trexmao楼主2021/1/25 12:04

如题,题解里面没有和我一样的二维DP,求助

#include<iostream>
using namespace std;
struct sitem{
	int val,vol;
};
struct item{
	int val,vol;
	bool has1=0,has2=0;
	sitem i1,i2;
}a[65];
int dp[65][32005];
int main(){
	int n,m;
	cin>>n>>m;
	int item_n=1;
	for(int i=0;i<m;i++){
		int t1,t2,t3;
		cin>>t1>>t2>>t3;
		if(t3==0){
			a[item_n].val=t1*t2;
			a[item_n].vol=t1;
			item_n++;
		}else{
			if(!a[t3].has1){
				a[t3].i1.val=t1*t2;
				a[t3].i1.vol=t1;
				a[t3].has1=1;
			}else{
				a[t3].i2.val=t1*t2;
				a[t3].i2.vol=t1;
				a[t3].has2=1;
			}
		}
	}
	for(int i=1;i<=item_n;i++){
		for(int j=0;j<=n;j++){
			if(j>=a[i].vol){
				dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i].vol]+a[i].val);
				if(a[i].has1&&a[i].i1.vol+a[i].vol<=j){
					dp[i][j]=max(dp[i][j],dp[i-1][j-a[i].vol-a[i].i1.vol]+a[i].val+a[i].i1.val);
				}
				if(a[i].has2&&a[i].i2.vol+a[i].vol<=j){
					dp[i][j]=max(dp[i][j],dp[i-1][j-a[i].vol-a[i].i2.vol]+a[i].val+a[i].i2.val);
				}
				if(a[i].has1&&a[i].has2&&a[i].i1.vol+a[i].i2.vol+a[i].vol<=j){
					dp[i][j]=max(dp[i][j],dp[i-1][j-a[i].vol-a[i].i1.vol-a[i].i2.vol]+a[i].val+a[i].i1.val+a[i].i2.val);
				}
			}else{
				dp[i][j]=dp[i-1][j];
			}
		}
	}
	cout<<dp[item_n][n];
}
2021/1/25 12:04
加载中...