首页 > 代码库 > 01背包
01背包
Charm Bracelet http://poj.org/problem?id=3624
01背包模板题带空间复杂度优化的。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define mt(a,b) memset(a,b,sizeof(a)) 5 using namespace std; 6 const int M=20010; 7 int n,v,dp[M],c[M],w[M]; 8 void ZeroOnePack(int cost,int weight){ 9 for(int i=v;i>=cost;i--){10 dp[i]=max(dp[i],dp[i-cost]+weight);11 }12 }13 int main(){14 while(~scanf("%d%d",&n,&v)){15 for(int i=1;i<=n;i++){16 scanf("%d%d",&c[i],&w[i]);17 }18 mt(dp,0);19 for(int i=1;i<=n;i++){20 ZeroOnePack(c[i],w[i]);21 }22 printf("%d\n",dp[v]);23 }24 return 0;25 }
饭卡 http://acm.hdu.edu.cn/showproblem.php?pid=2546
电子科大的饭卡5块可买50块的菜,我要转学。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define mt(a,b) memset(a,b,sizeof(a)) 5 using namespace std; 6 const int M=1024; 7 int w[M],dp[M]; 8 int n,v; 9 void ZeroOnePack(int cost,int weight){10 for(int i=v;i>=cost;i--){11 dp[i]=max(dp[i],dp[i-cost]+weight);12 }13 }14 int main(){15 while(~scanf("%d",&n),n){16 for(int i=1;i<=n;i++){17 scanf("%d",&w[i]);18 if(w[i]>w[1]) swap(w[1],w[i]);19 }20 scanf("%d",&v);21 if(v<5){22 printf("%d\n",v);23 continue;24 }25 v-=5;26 mt(dp,0);27 for(int i=2;i<=n;i++){28 ZeroOnePack(w[i],w[i]);29 }30 printf("%d\n",v+5-dp[v]-w[1]);31 }32 return 0;33 }
end
01背包
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。