求查错(?,思路跟大家不太一样可能
查看原帖
求查错(?,思路跟大家不太一样可能
1036281
mayisang楼主2024/9/19 15:48
#include <bits/stdc++.h>
using namespace std;
bool can = true;
int n,m,dp[10010][1010],k,x[10010],y[10010],p[10010],l[10010],h[10010],cnt;
int main(){
	cin >> n >> m >> k;
	for(int i = 0;i < n;i ++){
		cin >> x[i] >> y[i];
	}
	for(int i = 1;i <= k;i ++){
		int a,b,c;
		cin >> a >> b >> c;
		p[a] = 1;
		l[a] = b;
		h[a] = c;
	}
	for(int i = 1;i <= n;i ++){
		if(!p[i]){
			h[i] = m + 1;
		}
	}
	memset(dp,0x3f,sizeof(dp));
	for(int i = 1;i <= m;i ++){
		dp[0][i] = 0;
	}
	for(int i = 0;i < n;i ++){
		for(int j = 1;j <= m;j ++){
			int cntnow = 1;
			while(j + cntnow * x[i] < h[i + 1]){
				dp[i + 1][j + cntnow * x[i]] = min(dp[i + 1][j + cntnow * x[i]],dp[i][j] + cntnow);
				cntnow ++;
			}
			if(h[i + 1] == m + 1){
				dp[i + 1][m] = min(dp[i + 1][m],dp[i][j] + cntnow);
			}
			if(j - y[i] > l[i + 1]){
				dp[i + 1][j - y[i]] = min(dp[i + 1][j - y[i]],dp[i][j]);
			}
		}
	}
	for(int i = 1;i <= n;i ++){
		bool flag = false;
		for(int j = l[i];j <= h[i] - 1;j ++){
			if(dp[i][j] != 0x3f3f3f3f){
				flag = true;
			}
		}
		if(flag && p[i]){
			cnt ++;
		}
		if(!flag){
			can = flag;
			break;
		}
	}
	if(!can){
		cout << 0 << endl << cnt << endl;
	}
	else{
		int Min = 0x3f3f3f3f;
		for(int i = 1;i <= m;i ++){
			Min = min(Min,dp[n][i]);
		}
		cout << 1 << endl << Min << endl;
	}
	return 0;
}
2024/9/19 15:48
加载中...