背包
来源:互联网 发布:女生喜欢什么礼物知乎 编辑:程序博客网 时间:2024/04/29 22:34
我的心愿是世界和平!
0-1背包
给定背包容量,给任意个物品的重量以及价值,每个物品只有一个,求背包能容纳的最大价值。
#include<stdio.h>#include<iostream>using namespace std;struct Good{ int w; int v;}good[3410];int dp[12890];int main(){ int m,V,s,i,j; scanf("%d%d",&m,&V); for(i=1;i<=m;i++) scanf("%d%d",&good[i].w,&good[i].v); for(i=1;i<=m;i++) { for(j=V;j>=good[i].w;j--) { dp[j]=max(dp[j],dp[j-good[i].w]+good[i].v); } } printf("%d",dp[V]);}
完全背包
给定背包容量,给任意个物品的重量以及价值,每个物品有无数个,求背包能容纳的最大价值。
#include<stdio.h>#include<iostream>using namespace std;struct Good{ int w; int v;}good[3410];int dp[12890];int main(){ int m,V,s,i,j; scanf("%d%d",&m,&V); for(i=1;i<=m;i++) scanf("%d%d",&good[i].w,&good[i].v); for(i=1;i<=m;i++) { for(j=good[i].w;j<=V;j++) { dp[j]=max(dp[j],dp[j-good[i].w]+good[i].v); } } printf("%d",dp[V]);}
多重背包
给定背包容量,给任意个物品的重量以及价值,每个物品有指定个,求背包能容纳的最大价值。
#include<stdio.h>#include<iostream>using namespace std;struct T{ int w; int v;} t[2001];int dp[2001];int main(){ int T,sum,s,index,pr,wei,num,k,i,j; scanf("%d",&T); while(T--) { scanf("%d%d",&sum,&s); index=0; for(i=1; i<=s; i++)//在输入时转化为0-1背包并进行优化. { scanf("%d%d%d",&pr,&wei,&num); k=1; while(num-k>0) { num-=k; t[++index].v=pr*k; t[index].w=wei*k; k*=2; } t[++index].v=pr*num; t[index].w=wei*num; } for(i=0; i<=sum; i++) dp[i]=0; for(i=1; i<=index; i++) for(j=sum; j>=t[i].v; j--) dp[j]=max(dp[j],dp[j-t[i].v]+t[i].w); printf("%d\n",dp[sum]); } return 0;}
若要求使背包刚好装满时背包的最大容量,只需要将dp数组的初始化进行改变即可。
#define maxx 0x3f3f3f3fint main(){ dp[0]=0; for(i=1; i<=sum; i++) dp[i]=-maxx;}
阅读全文
0 0
- 【背包】
- 背包
- 背包
- 背包
- 背包..
- 背包
- 背包
- 背包
- 背包
- 背包
- 背包
- 背包
- 背包
- 背包
- 背包
- 背包
- 背包
- 背包
- 模糊查询封装
- Java内存管理
- Spring定时任务的几种实现
- C++使用SQLite3心得 -- sqlite3以二进制形式存取图片(MFC,CppSQLite3U封装类)
- 面向对象是什么?为什么要面向对象
- 背包
- Codeforecs 700D Connecting Universities 构造
- 顺序表应用1:多余元素删除之移位算法
- leetcode--Reverse Nodes in k-Group
- 在汇编代码中调用C函数
- JS常见算法-迭代
- DUBBO功能使用说明
- synchronized修饰静态方法和非静态方法的总结
- JSTL 标签库的使用