采药问题 c语言程序,采药 (C语言代码)
解題思路:這個題充分考察了算法的能力,實際上就是01背包的一個非常簡單的變形,如果可以我建議先百度一下01背包,再來看這個問題就會容易的多了。
運用到的知識:
多維數組,遞歸(知道為什么不好做了吧( ̄▽ ̄)"
注意事項:一定要注意數組的范圍!!!題主就是在這個非常平常的地方栽了跟頭。。。哭4
參考代碼:
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T,M,t[101],c[101];? //t[101]儲存每一個藥的時間,c[101]儲存每一個藥價值
int f[102][1002]={0};? //務必初始化,其實呢也可以只用把二維數組的第一行初始化就ok了
int i,j,k;
scanf("%d %d",&T,&M);
for(i=1;i<=M;i++)
{
scanf("%d %d",&t[i],&c[i]);
}
for(i=1;i<=M;i++)
{
for(j=1;j<=T;j++)
{
if(j>=t[i])
f[i][j]=max(f[i-1][j],f[i-1][j-t[i]]+c[i]);? //這就是01背包中的兩個狀態,采或者不采兩種情況哪個的價值最大
else
f[i][j]=f[i-1][j]; ?? //書包的空間(時間不夠了)
}
}
for(i=0;i<=M;i++)????????????//檢查所有的值,找最大的值
{
k=f[0][0];
for(j=0;j<=T;j++)
{
if(f[i][j]>k)
k=f[i][j];
}
}
printf("%d",k);
}
//其實呢,除了多維數組,一維數組利用遞歸也是可以解決問題滴
//不過,悲慘的超時了。。。。
int t[100],c[100];
int main()
{
int T,M,k,i;
scanf("%d %d",&T,&M);
for(i=1;i<=M;i++)
{
scanf("%d %d",&t[i],&c[i]);
}
int make(int ,int );
k=make(M,T);
printf("%d",k);
return 0;
}
int make(int i,int j)? ??//第 i個對象,剩余j個時間
{
if(i==0)
return 0;
if(j>=t[i])
{
int r1=make(i-1,j);
int r2=make(i-1,j-t[i])+c[i];
return r1>r2?r1:r2;
}
else return make(i-1,j);
}
總結
以上是生活随笔為你收集整理的采药问题 c语言程序,采药 (C语言代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像处理详解之图像透明度
- 下一篇: 《深度思维》读后感与实践