总分题目出处(1135)
这道题,我开始想多了,于是把他当做混合背包问题来想,然后就在自己的OJ上愉快超时。。。。。。
然后我以为是数组开小了,内存又爆了一遍。。。。。。
其实就是一个完全背包问题,下面给出状态转移方程:
dp[j]=max(dp[j],dp[j-a[i].t]+a[i].w);
其中t代表用时,w代表得分。
还是先上代码:
#include<cstdio>
#include<iostream>
using namespace std;
inline void read(int &x) {
x=0;int f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9')x=x*10+s-48,s=getchar();
x=x*f;
}
inline void pr(int x) {
if(x<0)putchar('-'),x=-x;
if(x>9)pr(x/10);
putchar(x%10+48);
}
struct node{
int t,m;
}a[10005];
int dp[10005],i,n,j,k,m;
int main() {
read(m),read(n);
for(i=1;i<=n;i++)
read(a[i].m),read(a[i].t);
for(i=1;i<=n;i++)
for(j=a[i].t;j<=m;j++)
dp[j]=max(dp[j],dp[j-a[i].t]+a[i].m);
pr(dp[m]);
}
补充一点,用#include<iostram>里面的max和min会快一些但为了保险,建议大家这样写:
inline int max(int x,int y) {
return x>y?x:y;
}
inline int min(int x,int y) {
return x<y?x:y;
}
大概就是这个样子,不懂的可以一起讨论一下