解题思路:建议大家看一下0-1背包问题(在这里一时半会也说不清楚,我看了好几天才明白一点,有点笨,哈哈^*_*^),然后利用一维状态转移方程f[i]=max(f[i],f[i-w[j]]+p[j])(也有二维的);i表示时间轮回,就是把时间从大到小轮流一下带入i
(
for(i=T;i>=w[j];i--)
{
f[i]=max(f[i],f[i-w[j]]+p[j]);
}
);
f[i]表示已采药草在当前时间下的最优解的价值的最大值,w[j]表示采第j种草药的时间,p[j]表示第j种草药的价值;
注意事项:p[101],w[101]这个一维数组大小一定要注意,如果是p[100],w[100]的话会错的,我找了好久才找到这个错误。。。。。。。
参考代码:
#include<stdio.h>
#define max(a,b) (a)>(b)?(a):(b)//取a,b最大值
int main(int argc, char *argv[])
{
int f[1001]={0};//用来保存时间的数组别忘初始化为0
int i;
int T,M,p[101],w[101],j;
scanf("%d %d",&T,&M);
for(i=0;i<M;i++)//M循环次数
{
scanf("%d %d",&w[i],&p[i]);//获得输入值
}
for(j=0;j<M;j++)//开始循环求每一次的最优解,从第一种药草开始循环,一直到最后一种
{
for(i=T;i>=w[j];i--)//i-w[j]必须大于等于0,就为负了,必须倒着循环!
{
f[i]=max(f[i],f[i-w[j]]+p[j]);//f[i]保存每一次循环后的最优解
}
}
printf("%d",f[T]);//最后一次循环的最后一个值就是最优解
return 0;
}
0.0分
0 人评分
C二级辅导-进制转换 (C语言代码)浏览:825 |
C语言训练-最大数问题 (C语言代码).........关于-1浏览:751 |
C语言训练-邮票组合问题* (C语言代码)......浏览:658 |
C语言训练-阿姆斯特朗数 (C语言代码)浏览:871 |
不知道哪里错了浏览:1156 |
字符串输入输出函数 (Java代码)浏览:1450 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:630 |
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:622 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:631 |
Tom数 (C语言代码)浏览:499 |