题意:
n个宝石,每个有重量和价值,要挂一些在手镯上,求满足总质量不超过m的最大总价值。n≤3402,m≤12880
题解:
01背包。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5 #define dec(i,j,k) for(int i=j;i>=k;i--) 6 #define maxn 50100 7 using namespace std; 8 9 inline int read(){ 10 char ch=getchar(); int f=1,x=0; 11 while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} 12 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 13 return f*x; 14 } 15 int n,m,f[maxn]; 16 int main(){ 17 n=read(); m=read(); 18 inc(i,1,n){ 19 int a=read(),b=read(); dec(j,m,a)f[j]=max(f[j],f[j-a]+b); 20 } 21 printf("%d",f[m]); return 0; 22 }
20160825