(题面还看不了,晚点加上题面)
AC 代码:
1 #include <bits/stdc++.h> 2 #pragma GCC optimize(3) 3 using namespace std; 4 typedef long long ll; 5 const int maxn=1e6+7; 6 const ll inf=0x3f3f3f3f3f; 7 const int maxm=1e4; 8 struct NODE 9 { 10 ll wei; 11 ll val; 12 } node[maxn]; 13 ll f[maxn]; 14 template<class T> 15 inline void read(T &x) 16 { 17 T ans=0,f=1; 18 char ch=getchar(); 19 while(ch>'9'||ch<'0') 20 { 21 if(ch=='-')f=-1; 22 ch=getchar(); 23 } 24 while(ch<='9'&&ch>='0') 25 { 26 ans=ans*10+(ch-'0'); 27 ch=getchar(); 28 } 29 x=ans*f; 30 } 31 int main() 32 { 33 int n; 34 ll m; 35 while(~scanf("%d %lld",&n,&m)) 36 { 37 for(register int i=1; i<=n; ++i) 38 { 39 read(node[i].val); 40 read(node[i].wei); 41 } 42 memset(f,inf,sizeof(f)); 43 f[0]=0; 44 for(register int i=1; i<=n; ++i) 45 { 46 for(register int j=node[i].wei; j<=maxm; ++j) 47 { 48 f[j]=min(f[j],f[j-node[i].wei]+node[i].val); 49 } 50 } 51 ll ansa=inf; 52 int ansb=0; 53 for(register int i=m; i<=maxm; ++i) 54 { 55 if(f[i]<ansa) 56 { 57 ansa=f[i]; 58 ansb=i; 59 } 60 else if(f[i]==ansa&&ansb<i) 61 { 62 ansb=i; 63 } 64 } 65 printf("%lld %d\n",ansa,ansb); 66 } 67 return 0; 68 }