经典的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;
}