01背包变形(背包容量大)
01背包变形(背包容量大)
转化成能够达到的最大价值
https://vjudge.net/problem/FZU-2214/origin
#include<stdio.h> #include<algorithm> using namespace std; const int maxn=1e3+6; int n; int w[maxn],v[maxn],dp[maxn]; //dp[i]表示i,价值为i的最小所需容量为dp[i] int sum=0; //01背包就地滚动 int main() { int n,vi; scanf("%d%d",&n,&vi); for(int i=1;i<=n;i++) scanf("%d",&w[i]); for(int i=1;i<=n;i++) { scanf("%d",&v[i]); sum+=v[i]; } for(int j=1;j<=sum;j++) dp[j]=100000000; dp[0]=0; for(int i=1;i<=n;i++) { for(int j=sum;j>=v[i];j--) { if(dp[j-v[i]]+w[i]<dp[j]) dp[j]=dp[j-v[i]]+w[i]; } } for(int j=sum;j>=0;j--) { if(dp[j]<vi) {printf("%d\n",j); break; } } }
浙公网安备 33010602011771号