题目描述:
小明去游乐园玩耍,他的票一共可以玩t分钟。
游乐场一共有n个项目,编号1到n,第i个项目需要a[i]的时间。游乐场规定,在票没有到期前,拥有者都可以入场,无论完成项目出场时该票是否已经过期。
小明可以任意决定玩项目的顺序,但是每个项目他只想玩一次。问小明最长可以玩多久?
第一行两个整数n,t,含义如题面,1≤n≤100,1≤t≤10000000;
接下来一行n个整数,第i个整数a[i]表示第i个项目所需的时间,1≤a[i]≤100。
输出一个整数,表示小明最长可以玩多久。
4 12
5 5 5 5
15
补充样例: 输入样例: 4 20 10 10 10 10 输出样例: 20
把项目时间排序,然后用从小到大的顺序选择项目。
当到最后一个可选项目的时候,选择耗时最多的项目。
1 //每个项目的总分钟数 2 List<int> listint = new List<int>() {6,4,2,3,1,5 }; 3 listint= listint.OrderByDescending(t=>t).ToList(); 4 //项目个数 5 int sum = listint.Count(); 6 //可以玩的分钟数 7 int minutes = 10; 8 minutes -= 1;//要使玩的分钟数最大,所以得给最大的项目留出一分钟出来 9 //玩项目的总分钟 10 int summin = listint[0]; 11 for (int i = 1; i < sum; i++) 12 { 13 if (minutes >= listint[i]) 14 { 15 summin += listint[i]; 16 minutes -= listint[i]; 17 } 18 } 19 Console.WriteLine(summin);
先去看一下 0-1背包 算法就明白了
#include <iostream.h>
int main()
{
int n,t;
int sum=0;
cout<<"请输入游乐场项目数n和游玩时间t"<<endl;
cin>>n>>t;
int a[100];
cout<<"请输入每个项目所需要的时间"<<endl;
for(int i=0;i<n;i++)
cin>>a[i];
while(sum<t) /*要求最长时间,即从时间长度最短的依次开始*/
{
int min=a[0];
for(i=1;i<n;i++)
{
if(a[i]>min)
min=a[i];
}
sum=sum+min;
}
cout<<"最长时间="<<sum<<endl;
return 0;
}
不好意思,弄反了!!
求最长时间应该从时间长度最长的依次开始