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