- 马上就要校赛了,也不能太水了吧,把学过的再自己打一边
- 这次一个字的书也不看 - -!
C - Cash Machine POJ - 1276
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[100009],c[100009],w[100009],m[100009];
int n,M,t;
void solve(int cost,int weight,int nn){
if(nn*cost>=M){
for(int i=cost;i<=M;i++){
dp[i]=max(dp[i-cost]+weight,dp[i]);
}
return;
}
int k=1;
while(k<nn){
for(int i=M;i>=k*cost;i--){
dp[i]=max(dp[i-k*cost]+k*weight,dp[i]);
}
nn-=k;
k*=2;
}
for(int i=M;i>=nn*cost;i--){
dp[i]=max(dp[i-nn*cost]+nn*weight,dp[i]);
}
}
int main()
{
while(~scanf("%d%d",&M,&n))
{
for(int i=1;i<=n;i++){scanf("%d%d",&m[i],&c[i]);w[i]=c[i];}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
solve(c[i],w[i],m[i]);
}
printf("%d\n",dp[M]);
}
return 0;
}
- 看了qty的题解,转化成0-1真是tqdl
http://qinruifeng.pro/category/acm-题解篇/2018-春季学期-第二周-基础dp/
第二天续,怎么理解qty深邃的思想啊 - -
- 百度搜索:完全背包模版题。。。
- poj1276 和 hdu2844
- 多重背包的模板题,多重背包问题是:
有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 - 这两道题没有给重量(就是一个题啊), 也就是v[i] = w[i];
- 第一种解法
- 判断不同情况而使用0-1或者完全背包的模版(也就是上面的,但是太乱了,应该把函数分开的)
*第二种解法,用二进制转换成0-1背包