P1048 [NOIP2005 普及组] 采药
代码:
#include "iostream"
#include "stdio.h"
using namespace std;
int w[105],val[105];
int dp[105][1005];
int main()
{
int t,m,res=-1;
scanf("%d%d",&t,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&w[i],&val[i]);
}
for(int i=1;i<=m;i++)
for(int j=t;j>=0;j--)
{
if(j>=w[i])
{
dp[i][j]=max(dp[i-1][j-w[i]]+val[i],dp[i-1][j]);
}
else
{
dp[i][j]=dp[i-1][j];
}
}
printf("%d",dp[m][t]);
return 0;
}
解析:
01背包
P1616 疯狂的采药
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+5,M=1e7+5;
int n,m,w[N],v[N],f[M];
signed main(){
scanf("%lld%lld",&m,&n);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&w[i],&v[i]);
for(int i=1;i<=n;i++)
for(int j=w[i];j<=m;j++)
f[j]=max(f[j],f[j-w[i]]+v[i]);
printf("%lld",f[m]);
return 0;
}
解析:
完全背包
P1049 [NOIP2001 普及组] 装箱问题
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int V,n,w,dp[233333];//dp数组尽量开大点,一般6位数就行
int main()
{
scanf("%d%d",&V,&n);//输入
for(int i=1;i<=n;i++)
{
scanf("%d",&w);//可以不用数组存,每次循环计算也可以
for(int j=V;j>=w;j--)
if(dp[j]<dp[j-w]+w)
dp[j]=dp[j-w]+w;//把能装的最大值给解出
}
printf("%d",V-dp[V]);//V-最大值的结果便是能装的最小空间
return 0;//好习惯!
}
解析:
完全背包
P1833 樱花
代码
#include<bits/stdc++.h>
using namespace std;
int a[10001],b[10001],c[10001],f[1000010],n,m;
int x1,yy,x2,y2;
int co[1000001],v[1000001],top;
void aaa()
{
for(int i=1;i<=n;i++)
{
int aa=1;
while(c[i]!=0)
{
co[++top]=a[i]*aa;
v[top]=b[i]*aa;
c[i]-=aa;
aa*=2;
if(c[i]<aa)
{
co[++top]=a[i]*c[i];
v[top]=b[i]*c[i];
break;
}
}
}
}
int main()
{
scanf("%d:%d %d:%d",&x1,&yy,&x2,&y2);
if(yy>y2)
{
y2+=60;
x2--;
}
m=(x2-x1)*60+y2-yy;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
if(!c[i]) c[i]=9999999;
}
aaa();
for(int i=1;i<=top;i++)
for(int j=m;j>=co[i];j--)
f[j]=max(f[j],f[j-co[i]]+v[i]);
printf("%d\n",f[m]);
}
解析: