![](https://i-blog.csdnimg.cn/blog_migrate/86715426322c88b23b41ceeb6a30852e.png)
思路:典型的01背包,直接打板子是过不了的,因为W太大了。首先要用滚动数组保证内存不超,其次要换成取得单位价值所需要的最小的w的思路,白书上有。见代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#define INF 1000000000
using namespace std;
int dp[50010];
int w[1010];
int v[1010];
int W,n;
void solve()
{
fill(dp,dp+50010,INF);
dp[0]=0;
int res;
for(int i=0;i<n;i++)
{
for(int j=50005;j>=v[i];j--)
dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
}
for(int i=0;i<50005;i++)
{
if(dp[i]<=W)
res=i;
}
printf("%d\n",res);
}
int main()
{
while(scanf("%d%d",&n,&W)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d%d",&w[i],&v[i]);
solve();
// printf("%d\n",dp[W]);
}
return 0;
}