DP——背包問題(二)
阿新 • • 發佈:2017-08-22
string 怎麽辦 using pre div str 如果 main cstring
01背包大家一定都會……
但如果01背包的W很大怎麽辦……
此時我們觀察,若v[i]很小,我們可以考慮建立有關v[i]的方程
方程內容大概是:在達到某一v時,所需的總w最小
說多了不如上代碼:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cmath> 5 #include<string> 6 #include<algorithm> 7 using namespace std; 8 int n,m,sumv,ans;9 int dp[300][234000],w[500],v[500],wi,vi; 10 int a[300]; 11 int main(){ 12 scanf("%d %d",&n,&m); 13 for(int i=1;i<=n;i++) scanf("%d %d",&w[i],&v[i]); 14 for(int i=1;i<=n;i++) sumv+=v[i]; 15 for(int j=0;j<=sumv;j++) dp[0][j]=200000000; 16 for(int i=1;i<=n;i++) 17 for(intj=sumv;j>=1;j--){ 18 wi=w[i]; 19 vi=v[i]; 20 if(j<=v[i]) dp[i][j]=min(dp[i-1][j],w[i]); 21 else{ 22 dp[i][j]=dp[i-1][j]; 23 dp[i][j]=min(dp[i][j],dp[i-1][j-v[i]]+w[i]); 24 } 25 } 26 for(int i=1;i<=sumv;i++) if(dp[n][i]<=m) ans=i;27 printf("%d\n",ans); 28 return 0; 29 }
DP——背包問題(二)