逃亡的准备
逃亡的准备
(hallows.pas/c/cpp)
【问题描述】
在《Harry Potter and the Deathly Hallows》中,Harry Potter他们一起逃亡,现在有许多的东西要放到赫敏的包里面,但是包的大小有限,所以我们只能够在里面放入非常重要的物品,现在给出该种物品的数量、体积、价值的数值,希望你能够算出怎样能使背包的价值最大的组合方式,并且输出这个数值,赫敏会非常地感谢你。
【输入文件】(hallows.in)
(1)第一行有2个整数,物品种数n和背包装载体积v。
(2)2行到n+1行每行3个整数,为第i种物品的数量m、体积w、价值s。.
【输出文件】(hallows.out)
输出文件hallows.out仅包含一个整数,即为能拿到的最大的物品价值总和。
【输入样例】
2 10
3 4 3
2 2 5
【输出样例】
13
【注释】
选第一种一个,第二种两个。
结果为3*1+5*2=13
【数据规模】
对于30%的数据
1<=v<=500
1<=n<=2000
1<=m<=10
1<=w<=20
1<=s<=100
对于100%的数据
1<=v<=500
1<=n<=2000
1<=m<=5000
1<=w<=20
1<=s<=100
一开始用多重背包做,但一直爆零 最后就弃坑啦
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 1010; int dp[N]; int w[N],s[N],num[N]; int n,V; int main() { freopen("hallow3.in","r",stdin); freopen("hallow.out","w",stdout); scanf("%d%d",&n,&V); for(int i=1; i<=n; i++) scanf("%d%d%d",&num[i],&w[i],&s[i]); memset(dp,0,sizeof(dp)); for(int i=1; i<=n; i++) { if(num[i]*w[i]>V) for(int j=w[i];j<=V;j++) dp[j]=max(dp[j],dp[j-w[j]]+s[i]); else { int k = 1; while(k < num[i]) { for(int j=V;j>=k*w[i];j--) dp[j]=max(dp[j],dp[j-k*w[i]]+k*s[i]); num[i] -= k; k <<= 1; } for(int j=V;j>=num[i]*w[i];j--) dp[j]=max(dp[j],dp[j-num[i]*w[i]]+num[i]*s[i]); } } printf("%d",dp[V]); return 0; }