01背包(ZeroOnePack): 有N件物品和一个容量为V的背包, 每种物品均只有一件。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2602
#include<cstdio> #include<iostream> #include<cstring> using namespace std; const int N=1000+10; int dp[N],c[N],w[N]; int main() { int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); int n,v; scanf("%d%d",&n,&v); int i,j; for(i = 0;i < n;i ++) { scanf("%d",&w[i]); } for(i = 0;i < n;i ++) { scanf("%d",&c[i]); } for(i=0;i<n;i++) for(j=v;j>=c[i];j--) dp[j]=max(dp[j],dp[j-c[i]]+w[i]); printf("%d\n",dp[v]); } return 0; }
完全背包(CompletePack): 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1114
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=10000+10,INF=1000000000; int dp[N]; int main() { int t; cin>>t; while(t--) { int n,v,a,b; cin>>a>>b; v=b-a; cin>>n; int i,j,c,w; for(i=0;i<=v;i++) dp[i]=INF; dp[0]=0; for(i=0;i<n;i++) { cin>>w>>c; for(j=c;j<=v;j++) dp[j]=min(dp[j],dp[j-c]+w); } if(INF==dp[v]) cout<<"This is impossible."<<endl; else cout<<"The minimum amount of money in the piggy-bank is "<<dp[v]<<"."<<endl; } return 0; }
多重背包(MultiplePack): 有N种物品和一个容量为V的背包,第i种物品最多有n[i]件可用。每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2191
#include<iostream> #include<cstring> using namespace std; const int N=110; int dp[N]; int main() { int t; cin>>t; while(t--) { memset(dp,0,sizeof(dp)); int v,n; cin>>v>>n; int i,j,k,c[N],w[N],num[N]; for(i=0;i<n;i++) cin>>c[i]>>w[i]>>num[i]; for(i=0;i<n;i++) { for(j=0;j<num[i];j++) { for(k=v;k>=c[i];k--) dp[k]=max(dp[k],dp[k-c[i]]+w[i]); } } cout<<dp[v]<<endl; } return 0; }
01背包、完全背包、多重背包
最新推荐文章于 2020-06-10 07:59:50 发布