一道不难的背包题但是WA20,只过了#1#2#3#4
查看原帖
一道不难的背包题但是WA20,只过了#1#2#3#4
115067
Adis_FireDevil楼主2022/11/23 14:41

dp[i][j][k]

i为搜索到第几个物品

j为用了多少时间

k=0是表示hack过的地方数量

k=105表示hack过的资源量

剩下的k从1-dp[i][j][0]表示hack过的地方

#include<bits/stdc++.h>
using namespace std;
struct port{
	int t,c,d,i;
}a[111];
int n,dp[105][2005][105],ans,ai,aj;
bool cmp(port a1,port a2){
	return a1.d<a2.d;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		a[i].i=i;
		cin>>a[i].t>>a[i].d>>a[i].c;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		for(int j=a[i].t;j<a[i].d;j++){
			if(dp[i][j][105]<dp[i-1][j-a[i].t][105]+a[i].c){
				dp[i][j][0]=dp[i-1][j-a[i].t][0]+1;
				for(int k=1;k<dp[i][j][0];k++){
					dp[i][j][k]=dp[i-1][j-a[i].t][k];
				}
				dp[i][j][dp[i][j][0]]=a[i].i;
				dp[i][j][105]=dp[i-1][j-a[i].t][105]+a[i].c;
			}
			if(dp[i][j][105]<dp[i-1][j][105]){
				for(int k=0;k<=105;k++){
					dp[i][j][k]=dp[i-1][j][k];
				}
			}
			if(dp[i][j][105]>ans||dp[i][j][105]==ans&&dp[i][j][0]<dp[ai][aj][0]){
				ans=dp[i][j][105];
				ai=i;
				aj=j;
			}
		}
	}
	cout<<ans<<endl<<dp[ai][aj][0]<<endl;
	sort(dp[ai][aj]+1,dp[ai][aj]+dp[ai][aj][0]+1);
	for(int i=1;i<=dp[ai][aj][0];i++){
		cout<<dp[ai][aj][i]<<" ";
	}
}
2022/11/23 14:41
加载中...