洛谷:采藥與瘋狂采藥
P1048 采藥(01背包問題)
題目描述
辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞裏對他說:“孩子,這個山洞裏有一些不同的草藥,采每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裏,你可以采到一些草藥。如果你是一個聰明的孩子,你應該可以讓采到的草藥的總價值最大。”
如果你是辰辰,你能完成這個任務嗎?
輸入輸出格式
輸入格式:
第一行有 22 個整數 T(1 \le T \le 1000)T(1≤T≤1000) 和 M(1 \le M \le 100)M(1≤M≤100) ,用一個空格隔開, TT 代表總共能夠用來采藥的時間, MM 代表山洞裏的草藥的數目。
接下來的 MM 行每行包括兩個在 11 到 100100 之間(包括 11 和 100100 )的整數,分別表示采摘某株草藥的時間和這株草藥的價值。
輸出格式:
11 個整數,表示在規定的時間內可以采到的草藥的最大總價值。
輸入輸出樣例
輸入樣例#1: 復制70 3 71 100 69 1 1 2輸出樣例#1: 復制
3
說明
對於30%的數據, M \le 10M≤10 ;
對於全部的數據, M \le 100M≤100 。
NOIP2005普及組第三題
菜雞代碼:
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
int v[105],w[105];
int a[105][1005];
int main()
{ int i,j;
memset(a,0,sizeof(a));
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>v[i]>>w[i];
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(j>=v[i])
{
a[i][j]=max(a[i-1][j],a[i-1][j-v[i]]+w[i]);
}
else a[i][j]=a[i-1][j];
}
}
cout<<a[m][n]<<endl;
return 0;
}
P1616 瘋狂的采藥(完全背包問題)
題目背景
此題為NOIP2005普及組第三題的瘋狂版。
此題為紀念LiYuxiang而生。
題目描述
LiYuxiang是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞裏對他說:“孩子,這個山洞裏有一些不同種類的草藥,采每一種都需要一些時間,每一種也有它自身的價值。我會給你一段時間,在這段時間裏,你可以采到一些草藥。如果你是一個聰明的孩子,你應該可以讓采到的草藥的總價值最大。”
如果你是LiYuxiang,你能完成這個任務嗎?
此題和原題的不同點:
1.每種草藥可以無限制地瘋狂采摘。
2.藥的種類眼花繚亂,采藥時間好長好長啊!師傅等得菊花都謝了!
輸入輸出格式
輸入格式:
輸入第一行有兩個整數T(1 <= T <= 100000)和M(1 <= M <= 10000),用一個空格隔開,T代表總共能夠用來采藥的時間,M代表山洞裏的草藥的數目。接下來的M行每行包括兩個在1到10000之間(包括1和10000)的整數,分別表示采摘某種草藥的時間和這種草藥的價值。
輸出格式:
輸出一行,這一行只包含一個整數,表示在規定的時間內,可以采到的草藥的最大總價值。
輸入輸出樣例
輸入樣例#1: 復制70 3 71 100 69 1 1 2輸出樣例#1: 復制
140
說明
對於30%的數據,M <= 1000;
對於全部的數據,M <= 10000,且M*T<10000000(別數了,7個0)。
加油LiYuxiang,第一個AC留給你!
代碼:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int ti,m,a,b,c[100002];
int main()
{ int i,j;
memset(c,0,sizeof(c));
cin>>ti>>m;
for(i=1;i<=m;i++)
{
cin>>a>>b;
for(j=1;j<=ti;j++)
{
if(j>=a) c[j]=max(c[j],c[j-a]+b);
}
}
cout<<c[ti]<<endl;
}
洛谷:采藥與瘋狂采藥