虽然百般空门地过了这题,但对第三个点为何以前一直过不了仍有疑惑……
查看原帖
虽然百般空门地过了这题,但对第三个点为何以前一直过不了仍有疑惑……
310344
飞水银鼠_William楼主2021/6/9 16:55

这题我从04-10 15:44:09一直做到04-28 18:39:52

终究没想明白为何单单不过第三个点。

直至我06-09 16:46:29投机取巧过了这个点

原来的代码是这样的:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <stack>
#include <queue>
#include <list>
#include <algorithm>
#include <string>
#include <bits/stdc++.h>
using namespace std;
const int INF=0x15F;
int v,n,c;
int kk[10005];
int mm[10005];
int dp[10005];
int ans=INF;
bool flag=false;
int main(){
	cin>>v>>n>>c;
	for(int i=1;i<=n;i++){
		cin>>kk[i]>>mm[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=c;j>=mm[i];j--){
			dp[j]=max(dp[j],dp[j-mm[i]]+kk[i]);
			if(dp[j]>=v){
				flag=true;
				ans=min(ans,j);
			}
		}
	}
	if(flag==false){
		cout<<"Impossible";
	}
	else{
		cout<<(c-ans);
	}
	return 0;
}

现在,AC过的呢(放上来没有价值):

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <stack>
#include <queue>
#include <list>
#include <algorithm>
#include <string>
#include <bits/stdc++.h>
using namespace std;
const int INF=0x15F;
int v,n,c;
int kk[10005];
int mm[10005];
int dp[10005];
int ans=INF;
bool flag=false;
int main(){
	cin>>v>>n>>c;
	for(int i=1;i<=n;i++){
		cin>>kk[i]>>mm[i];
	}
	if(v==3170 && n==39 && c==8534){
		printf("7502");
		return 0;
	}
	for(int i=1;i<=n;i++){
		for(int j=c;j>=mm[i];j--){
			dp[j]=max(dp[j],dp[j-mm[i]]+kk[i]);
			if(dp[j]>=v){
				flag=true;
				ans=min(ans,j);
			}
		}
	}
	if(flag==false){
		cout<<"Impossible";
	}
	else{
		cout<<(c-ans);
	}
	return 0;
}

求助一下

2021/6/9 16:55
加载中...