两道都是经典的DP题,没什么好说,记住模板就好
/*
* 1342.HappyKimming.cpp
*
* Created on: 2014年7月6日
* Author: Prophet
*/
#include<stdio.h>
#include<string.h>
//#include<math.h>
//const int maxn = 100;
int max(int a,int b);
int main(){
int N,m;
while(scanf("%d%d",&N,&m)!=EOF){
int w[m],v[m];
int temp;
for(int i=0;i<m;i++){
scanf("%d%d",&w[i],&temp);
v[i] = w[i]*temp;
}
int dp[m+1][N+1];//dp[m+1][n]:从前m个物品中选出总价钱不超过n的物品时乘积最大值
memset(dp,0,sizeof(dp));
for(int i=0;i<m;i++){
for(int j=0;j<=N;j++){
if(j<w[i])//从第一个物品的价钱开始,如果总价值比之小那肯定不能取,dp值和之前一样
dp[i+1][j] = dp[i][j];
else//如果可以取这个物品,那就看取了之后和没取的值比较
dp[i+1][j] = max(dp[i][j],dp[i][j-w[i]]+v[i]);
}
}
printf("%d\n",dp[m][N]);
}
return 0;
}
int max(int a,int b){
if(a<b)
return b;
else
return a;
}
/*
* Sicily1146CollectingMedicine.cpp
*
* Created on: 2014年7月6日
* Author: Prophet
*/
#include<stdio.h>
#include<string.h>
int max(int a,int b);
int main(){
int T,M;
scanf("%d%d",&T,&M);
int w[M],v[M];
for(int i=0;i<M;i++)
scanf("%d%d",&w[i],&v[i]);
int dp[M+1][T+1];
memset(dp,0,sizeof(dp));
for(int i=0;i<M;i++){
for(int j=0;j<=T;j++){//这里注意一定要写成j<=T,之前写成j<T答案就是0,因为没算到最后一个
if(j<w[i])
dp[i+1][j] = dp[i][j];
else
dp[i+1][j] = max(dp[i][j],dp[i][j-w[i]]+v[i]);
}
}
printf("%d\n",dp[M][T]);
return 0;
}
int max(int a,int b){
if(a<b)
return b;
else
return a;
}