经典的01背包问题,如果把限制条件改为:重量<=10^9时,或更大时,就不能用以前的方法了,,在复杂度为O(nw)的经典解法下也妥妥得TLE
SO...这里要改变DP对象,为价值
dp[i]表示价值为i时的总重量最小值
注意初始化:除dp[0]外,其余的为无穷大
#include <iostream>
#include<stdio.h>
#define INF 10000000
using namespace std;
int c[105],v[105];
int dp[10005]; //dp[i],表示在价值i下的最小重量
int main()
{
//freopen("1.txt","r",stdin);
int w,n;
int i,j;
int ans;
while(cin>>n>>w)
{
ans=0;
for(i=0;i<10000;i++)
dp[i]=INF;
dp[0]=0;
for(i=0;i<n;i++)
cin>>v[i]>>c[i];
for(i=0; i<n; i++)
for(j=10000; j>=c[i]; j--)
{
dp[j]=min( dp[ j-c[i] ] + v[i] , dp[j] );
}
for(i=0; i<10000; i++)
if(dp[i]<=w&&ans<i)
ans=i;
cout<<ans<<endl;
}
return 0;
}