这题我从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;
}
求助一下