題目鏈結 nyoj747
【題意】
時間限制:
2000 ms | 記憶體限制:
65535 kb
難度: 4
描述 螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。
已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi, 如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai-t*bi的美味指數,當然,用第i件食材做飯要花去ci的時間。
眾所周知,螞蟻的廚藝不怎麼樣,所以他需要你設計做飯方案使得在時間
t
內完成的美味指數最大。
輸入
有多組測試資料。
第一行是兩個正整數,表示螞蟻的做飯時間t和食材個數n。(n<=50, 1<=t<=100000)。
接下來n行,每行有三個數,ai,bi,ci。分別代表美味度、新鮮度和用該食材做飯花費的時間。(0輸出
輸出乙個數字,表示最大美味指數
樣例輸入
6 1200 5 1
樣例輸出
195
【分析】
很像01揹包,一開始知道需要先貪心排序,但是怎麼也找不到如果排序,貪心還是太弱,後來看了出題人的部落格才知道;需要用相鄰的兩個物品1和2;
然後分別寫出1先做和2先做可以得到的最大價值,並且假設現在已經是t時刻:
如果1物品先做:a[1]-(p+c[1])*b[1]+a[2]-(p+c[1]+c[2])*b2;(1)
如果2物品先做:a[2]-(p+c[2])*b[2]+a[1]-(p+c[1]+c[2])*b1;(2)
則可以按照(1)>(2)來排序,化簡(1)>(2)為c[2]*b[1]>c[1]*b[2];
接下來直接01揹包就可以了
【ac**】32ms
#include #include #include using namespace std;
#define maxn 100001
#define min(a,b) (ab?a:b)
struct nodep[51];
int ans, ch, dp[maxn];
int in()
inline bool cmp(const node& a, const node& b)
int main()
sort(p,p+n,cmp);
memset(dp,0,sizeof(dp));
for (int i = 0; i < n; i++)
for (int i = 0; i <= m; i++)
ans = max(ans,dp[i]);
printf("%d\n", ans);
} return 0;
}
nyoj 747 螞蟻的難題 三
時間限制 2000 ms 記憶體限制 65535 kb 難度 4 描述 螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi,如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai t bi的美味指數,當然,用第i件食材做飯要花去ci的時間。眾...
nyoj 747 螞蟻的難題 三 dp揹包
時間限制 2000 ms 記憶體限制 65535 kb 難度 4 描述 螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi,如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai t bi的美味指數,當然,用第i件食材做飯要花去ci的時間。眾...
螞蟻的難題 三
螞蟻的難題 三 時間限制 2000 ms 記憶體限制 65535kb 難度 4 描述 螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi,如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai t bi的美味指數,當然,用第i件食材做飯要花去...